2014-02-20 1 views
0

У меня есть Item модели, которая имеет следующие ассоциации:Регистрация одного элемента из соответствующей таблицы на основе мин поля

public $hasOne = array(
    'Project' => array(
     'className' => 'Project', 
     'foreignKey' => 'item_id' 
    ) 
); 
public $hasMany = array(
    'ItemPic' => array(
     'className' => 'ItemPic', 
     'foreignKey' => 'item_id', 
     'dependent' => false 
    ) 
); 

Я желающее пользовательские данные для различных представлений Item. Кажется, что CakePHP автоматически включает в себя данные Project (может быть, потому, что это hasOne?) И не включает данные ItemPic. В index я действительно даже не хочу данных Project ... однако, мне нужны данные ItemPic. За каждую выписку Item я хочу, чтобы к ней присоединилась одна запись ItemPic. Этот ItemPic должен быть в основном ItemPic.item_id = Item.id и ORDER BY ItemPic.rank LIMIT 1.

Целью этого является то, что в индексе я могу показать список элементов и изображение, связанное с каждым элементом. Я хотел бы, чтобы все изображения вместе с данными Project в view для одного Item, но не в списке/указателе.

мне сказали, что я мог бы использовать containable так:

// In the model 
public $actsAs = array('Containable'); 

// In the controller 
$this->paginate = array(
    'conditions' => $conditions, 
    'contain' => array(
     'ItemPic' => array(
      'fields' => array('file_name'), 
      'order' => 'rank', 
      'limit' => 1 
     ) 
    ) 
); 

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

Я попытался сделать это, но я получаю дубликаты данных, и это не придает ItemPic данные:

$this->paginate = array(
      'conditions' => $conditions, 
      'joins' => array(
        array(
          'table' => 'item_pics', 
          'alias' => 'ItemPic', 
          'type' => 'LEFT', 
          'conditions' => array(
            'ItemPic.item_id = Item.id' 
          ), 
          'order' => 'rank ASC', 
          'limit' => 1 
        ) 

      ) 
    ); 
    $paginated = $this->Paginator->paginate(); 

ответ

0

Можете ли вы попробовать это:

$this->paginate = array(
     'conditions' => $conditions, 
     'joins' => array(
       array(
         'table' => 'item_pics', 
         'alias' => 'ItemPic', 
         'type' => 'LEFT', 
         'conditions' => array(
           'ItemPic.item_id = Item.id' 
         ), 
         'order' => 'rank ASC', 
         'limit' => 1 
       ) 

     ), 
    'fields' => array('Item.*','Project.*','ItemPic.*') 
    ); 

В разделе fileds вы, возможно, или не может назначать «Предмет», «Проект» в соответствии с вашим требованием.

Благодаря

+0

Это действительно похоже на работу для добавления 'ItemPic' вещи, и я могу удалить' project' материал, который хорошо. Однако сейчас я получаю дубликаты данных. Я получаю элемент 1 с каждым изображением, связанным с ним в разных строках, а не только с элементом 1 с изображением минимального ранга 1. – smerny

+0

Вот запрос, который он использует с вышеперечисленным: http://pastebin.com/1VWXXGTy (я также замечаю, что он все еще присоединяется к «Project». И вот результирующий массив (обрезанный): http: // pastebin. com/nQkMUiCG – smerny

+0

Я предполагаю, что поля 'order' и' limit' в массиве 'joins' не работают (или, по крайней мере, не так, как я ожидал). – smerny

 Смежные вопросы

  • Нет связанных вопросов^_^