«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как выполнить запрос на соединение с помощью метода find CakePHP?

Как выполнить запрос на соединение с помощью метода find CakePHP?

Опубликовано 2 ноября 2024 г.
Просматривать:559

How to Perform a Join Query with CakePHP\'s find Method?

Найти метод с помощью JOIN в CakePHP

В этом вопросе рассматривается, как выполнить запрос, объединяющий две таблицы, сообщения и пользователей, с помощью поиска CakePHP. метод. В частности, нам нужно получить информацию из обеих таблиц на основе условия, когда поле messages.from равно полюusers.id, а поле messages.to равно 4.

Существуют два основных методы достижения такого соединения в CakePHP: стандартный способ CakePHP и использование пользовательского соединения.

Стандартный способ CakePHP

Рекомендуемый подход — использовать стандартный метод CakePHP, который включает в себя создание связей между моделями и использование сдерживаемого поведения. Вот как это сделать:

  1. Определите отношения в моделях пользователя и сообщения:

    class User extends AppModel {
     public $actsAs = array('Containable');
     public $hasMany = array('Message');
    }
    
    class Message extends AppModel {
     public $actsAs = array('Containable');
     public $belongsTo = array('User');
    }
  2. Переименуйте столбец messages.from в messages.user_id, чтобы облегчить автоматическое связывание на основе отношений.
  3. Выполните следующий поисковый запрос:

    $this->Message->find('all', array(
     'contain' => array('User'),
     'conditions' => array(
         'Message.to' => 4
     ),
     'order' => 'Message.datetime DESC'
    ));

Пользовательское объединение

В качестве альтернативы вы можете использовать произвольное объединение в запросе поиска:

$this->Message->find('all', array(
    'joins' => array(
        array(
            'table' => 'users',
            'alias' => 'UserJoin',
            'type' => 'INNER',
            'conditions' => array(
                'UserJoin.id = Message.from'
            )
        )
    ),
    'conditions' => array(
        'Message.to' => 4
    ),
    'fields' => array('UserJoin.*', 'Message.*'),
    'order' => 'Message.datetime DESC'
));

В этом пользовательском объединении мы явно определяем условия объединения и выбираем возвращаемые поля.

Использование двух отношений к одной и той же модели

Если вы хотите установить две связи с одной и той же моделью, вы можете определить их следующим образом:

class User extends AppModel {
    public $actsAs = array('Containable');
    public $hasMany = array(
        'MessagesSent' => array(
            'className'  => 'Message',
            'foreignKey' => 'from'
         ),
        'MessagesReceived' => array(
            'className'  => 'Message',
            'foreignKey' => 'to'
         )
    );
}

class Message extends AppModel {
    public $actsAs = array('Containable');
    public $belongsTo = array(
        'UserFrom' => array(
            'className'  => 'User',
            'foreignKey' => 'from'
        ),
        'UserTo' => array(
            'className'  => 'User',
            'foreignKey' => 'to'
        )
    );
}

Определив эти связи, вы можете использовать такой запрос поиска:

$this->Message->find('all', array(
    'contain' => array('UserFrom'),
    'conditions' => array(
        'Message.to' => 4
    ),
    'order' => 'Message.datetime DESC'
));
Заявление о выпуске Эта статья перепечатана по адресу: 1729175782. В случае каких-либо нарушений, пожалуйста, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3