Нужна помощь с условиями в CakePHP! - PullRequest
0 голосов
/ 14 августа 2010

У меня есть три модели, связанные таким образом: Товар-> Заказ-> Оплата

Заказ имеет много товара
ЗаказhasOne Payment

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

Я добавил условие как:

массив ('Payment.id' => $ id)

, ноэто не работаетОчевидно, причина, по которой оплата не связана с товаром.

Итак, как мне это сделать?

Ответы [ 4 ]

1 голос
/ 15 августа 2010

Я новичок в cakephp, может быть, я совершенно не прав, но, насколько я понимаю, вы можете использовать другие модели в вашем контроллере с переменной $ users. Сначала сделайте запрос к модели оплаты, чтобы получить идентификатор вашего заказа, затем вы можете использовать этот идентификатор, чтобы найти соответствующие позиции.

$uses=array('Item','Order','Payment');
$order_id=$this->Payment->find('first',array('fields'=>'order_id','conditions'=>array('id'=>$payment_id)));
$items=$this->Item->find('all',array('conditions'=>array('order_id'=>$order_id)));

Надеюсь, это поможет.

0 голосов
/ 20 августа 2010

Убедитесь, что уровень отладки в app / config / core.php установлен на 2, чтобы увидеть вызовы базы данных.

1) Вы можете использовать Контейнерное поведение , в этом случае вынужно поместить это в модель вашего предмета:

var $actsAs = array('Containable');

и это в ваш контроллер предметов:

$items = $this->Item->find('all'
   , array (
      'contain' => array('Order' => array('Payment'))
      , 'conditions' => array('Payment.id' => $paymentId)
   )
)

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

2) Если вы не можете заставить работать содержимое, тогда я часто использую объединения explict (прочитайте эту статью nake on joins ) в моих запросах поиска.Таким образом, в вашем контроллере Предметов у вас будет:

$items = $this->Item->find('all'
   , array (
      , 'joins' => array(
         array(
            'table' => 'payments'
            , 'alias' => 'Payment'
            , 'type' => 'INNER'
            , 'conditions' => array(
                'Option.id = Payment.option_id'
            )
         )
      )
      , 'conditions' => array('Payment.id' => $paymentId)
   )
)

Возможно, вам также потребуется указать объединение в таблице параметров.

0 голосов
/ 19 августа 2010

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

в Payment.php

//recursion level 1
var $belongsTo = array('Order');

в Order.php

//recursion level 2
var $hasMany = array('Items')

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

в PaymentController.php

//Query two levels deep, so the $payment['Order']['Item'][0-n] will be present
var $paginate = array('recursive' => 2);

Обратите внимание, что этот метод генерирует другой запрос для каждой строки для извлечения элементов.

0 голосов
/ 14 августа 2010

Почему бы вам не добавить условие:

array('Order.payment_id'=>$id)

Я думаю, что это должно работать.

...