Торт HABTM Query, Order By Rand () - PullRequest
4 голосов
/ 08 ноября 2010

Я знаю, что ассоциации Cake HABTM в лучшие времена сложны, но я, кажется, усложняю себе жизнь ...

Если я хочу вернуть случайный Предмет из БД, Я могу сделать это следующим образом в модели Item:

$random = $this->find('first', array(
    'order' => 'rand()'
));

, и если я хочу найти все Предметы, которые находятся в определенной Категории (где Item имеет отношение HABTM к Категориям), я знаю, чтоможно получить набор результатов через $ this-> Categories-> find.

Мой вопрос: как я могу объединить два, чтобы я мог вернуть случайный элемент, который принадлежит указанной категории?Есть ли простой способ?(Если нет, я с удовольствием приму любые предложения для трудоемкого способа, пока он работает;)

ETA: я могу получить некоторые пути с помощью Containable, может быть: скажем, я добавлю строку

'contain' => array('Categories'=>array('conditions'=>array('Categories.id'=>1))),

тогда результат Item, который я не хочу возвращать с пустым массивом Categories, чтобы отличить их от "хороших" элементов.Но на самом деле я не хочу, чтобы результаты Item возвращались вообще ...

ETA (2): я могу обойтись, сбросив результаты в afterFind, если массив Categories пуст (спасибона http://nuts -and-bolts-of-cakephp.com / 2008/08/06 / filtering-results-возвращено-byableable-поведение / для подсказки), а затем мой случайный поискфункция не сдается до тех пор, пока не получит результат:

while (!is_array($item)) {
    $item = $this->random($cat);
}

но тьфу, это может быть какой-нибудь более грубым?В любом случае, пора мне прекратить редактировать свой вопрос и вместо этого уйти и спать на нем!

1 Ответ

4 голосов
/ 08 ноября 2010

Попробуйте это:

<?php
$this->Item->bindModel(array('hasOne' => array('ItemsCategory')));
$random = $this->Item->find('all', array(
  'order' => 'rand()',
  'conditions' => array('ItemsCategory.category_id' => '1')
  ));
?>
...