Фильтрация результатов модели контейнера - PullRequest
1 голос
/ 04 октября 2011

Я пытаюсь с помощью следующей строки кода отфильтровать все сообщения, которые имеют определенные (не относящиеся к делу) условия, по тегу "кто"

$ com = $ this-> Post-> find ('все ', массив (' условия '=> $ условия,' содержать '=>' Tag.tag = "кто" '));

Однако вместо результатов будут только сообщения с тегами,Я получаю каждое сообщение с пустыми массивами тегов для тех, у которых нет тега "кто".

Я знаю, что мой вопрос поднимался раньше, но опубликованные решения не сработали с моим кодом.Я попытался адаптировать код здесь к своему собственному: http://web -development-blog.co.uk / 2010/09/14 / cakephp-habtm-find-with-условий-and-Containable-поведение / , но я получаю ошибку SQL, в которой говорится, что «Tag.post_id» не найден в предложении on.

Пожалуйста, помогите.

Сообщение об ошибке при попытке реализовать код по выбранной ссылке:

SELECT `Post`.`id`, `Post`.`title`, `Post`.`body`, `Post`.`created`,       `Post`.`modified`, `Tag`.`id`, `Tag`.`tag`, `Tag`.`created`, `Tag`.`modified` FROM `posts` AS `Post` LEFT JOIN `tags` AS `Tag` ON (`Tag`.`post_id` = `Post`.`id`) WHERE `Tag`.`tag` = 'who'    1054: Unknown column 'Tag.post_id' in 'on clause'            

Что вызвано использованием этого:

$this->Post->bindModel(array('hasOne' => array('Tag')));
$this->Post->contain(array(
  'Tag'
));
$com=$this->Post->find('all', array(
  'conditions'=>array('Tag.tag'=>'who') 
)); 

1 Ответ

0 голосов
/ 04 октября 2011

Ваша ошибка в том, что вы используете bindModel без указания иностранного ключа или чего-либо еще, вы ДОЛЖНЫ установить ассоциации в модели и просто использовать этот метод «на лету», когда это строго необходимо.

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

Также вы должны использовать имеет много ассоциаций или, по крайней мере, я думаю,так.Я сказал это, потому что я полагаю, что пост может иметь несколько тегов.

после того, как вы выполните ассоциирование в модели и удалите эту строку

$ this-> Post-> bindModel (array ('hasOne)'=> array (' Tag ')));

он должен работать идеально

ИЛИ вы можете связать правильные параметры на лету, прочитав поваренную книгу для этого пример, который показывает, как поставить имя класса, является тем, который вы ищете, просто добавьте другие атрибуты

РЕДАКТИРОВАТЬ:

Извините, прочитал что-то неправильно ... ассоциация имеет многоне выполняйте объединение, поэтому вы должны использовать «Содержимое», чтобы указать условие или добавить условие в сопоставление «на лету», вот как должен выглядеть ваш код после добавления условий с содержанием

$contain = array(
  'Tag' => array(
       'conditions'=> array('Tag.tag'=>'who') 
   )
);
$com=$this->Post->find('all', array(
  'contain'=>$contain 
));

ПОМНИТЕ содержатьусловия переопределяют условия в ассоциациях !!если вы хотите иметь дополнительные условия, вы должны добавить их на лету примерно так:

$this->Post->hasMany['Tag']['conditions'] += array('Tag.tag'=>'who');

Помните, что ассоциации на лету будут работать ТОЛЬКО для этого экземпляра.

Также вы можете сделатьhasmany псевдоним для разных типов (не забудьте всегда определять имя класса и Foreignkey).

Надеюсь, на этот раз это сработает, если не просто прокомментировать, чтобы увидеть, как это исправить;)

...