Найти условие об отношениях hasMany в cakephp - PullRequest
4 голосов
/ 11 марта 2010

Я работаю над действием для поиска сообщений в моем проекте, и вот две модели: Msgcontent и Msgblock. Отношения - это Msgblock, имеет много Msgcontent. Что я хочу сделать, это получить все записи Msgblock, содержащие Msgcontent, с некоторым поиском.Ключевое слово. Мой код выглядит следующим образом:

if($keyword)
{
    $conditions['and'] = array(
                                'Msgcontent.content LIKE'=>'%'.$keyword.'%',
                                'Msgcontent.content <>'=>''
                );
    $results = $this->Msgblock->Msgcontent->find('all',array('group'=>array('Msgblock.chatsessionid'),'conditions'=>$conditions));
}

Кажется, это не очень хорошая работа. Есть ли лучшее решение? Спасибо.

Ответы [ 4 ]

8 голосов
/ 11 марта 2010

Если не считать написания собственного SQL-запроса с соответствующими JOIN, это самый простой способ сделать это в Cake с двумя запросами:

$ids = $this->Msgblock->Msgcontent->find('all', array(
    'fields' => array('Msgcontent.msgblock_id'),
    'recursive' => -1,
    'conditions' => ...
));

$this->Msgblock->find('all', array(
    'conditions' => array('Msgblock.id' => Set::extract('/Msgcontent/msgblock_id', $ids))
));
1 голос
/ 20 марта 2012

Вы можете использовать bindModel с условиями, например:

$this->Msgblock->bindModel(
                   array(
                     'hasMany' => array(
                         'Msgcontent' => array(
                            'className' => 'Msgcontent',
                            'conditions' => array(
                                'Msgcontent.content LIKE' => "%$keyword%"
                            )
                         )
                     )
);

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

0 голосов
/ 28 марта 2013

Это идеальная ситуация для использования поведения Cake's Containable, как описано в превосходном ответе multidèria на очень похожий вопрос . Либо добавьте Containable к вашей модели Msgcontent $actsAs, либо добавьте поведение на лету.

0 голосов
/ 01 июля 2012

Настройка подзапроса в ваших условиях, который ищет таблицу hasMany и возвращает счетчик, если найден.

(выберите количество (id) из YOUR_HAS_MANY_TABLE, где YOUR_HAS_MANY_TABLE.foreign_key = MAIN_TABLE.id, где YOUR_HAS_MANY_TABLE.field_to_search = '% SEARCH%')> 0

Это не невероятно эффективно, но при правильной индексации это решение, которое может выполнить работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...