CakePHP получает данные от нескольких моделей - PullRequest
0 голосов
/ 07 сентября 2010

В моем приложении CakePHP у меня есть модель под названием «Клиент», которая (неудивительно) описывает отдельного клиента. Затем у меня есть модель «Продажа» о продаже. (Один клиент на продажу, много продаж на клиента). Каждая продажа имеет «car_id» (который сопоставляется с моделью «Car») и «engine_id» (сопоставляется с «моделью двигателя»). В настоящее время, когда я получаю информацию об одном клиенте, он включает детали каждой продажи, связанной с этим клиентом, но я хочу пойти еще на один шаг глубже и иметь для каждой продажи детали каждого автомобиля и каждого двигателя. Как мне это сделать?

Я понимаю отношения между моделями, но я явно что-то упускаю. Моя текущая настройка такова ...

Customer: $hasMany = 'Sales';

Sale: $hasOne = array('Car', 'Engine');

Очевидно, что 'Car' и 'Engine' не имеют связанных с этим sales_id, поскольку они могут принадлежать множеству разных продаж.

Ответы [ 3 ]

1 голос
/ 07 сентября 2010

Насколько я понимаю, ваши отношения таковы:

Customer -> Sale -> Car -> Engine

Линейный, что означает, что автомобиль НЕ связан с покупателем, кроме как через продажу. Если это правильно, вам нужно только установить отношения в каждой из моделей, чтобы они правильно идентифицировались:

Customer hasMany Sale
Sale belongsTo Customer
Sale hasMany Car
Car belongsTo Sale
Car hasMany Engine
Engine belongsTo Car

Затем, когда вы запрашиваете базу данных, вы можете сделать что-то вроде:

$this->Customer->find('first', array(
     'conditions' => array('id' => $ID),
     'recursive' => 1          // or 2 depending on your need
  )
);

Это позволит вам довольно легко углубляться в данные.

Подробнее об этом здесь: http://book.cakephp.org/view/73/Retrieving-Your-Data

1 голос
/ 07 сентября 2010

Ознакомьтесь с поведением Containable, оно должно позволить вам делать все, что вам нужно: http://book.cakephp.org/view/1323/Containable

В этом случае, если вы включите в своих моделях содержимого, вы можете сделать что-то вроде этого:

$this->Customer->find('first', array(
    conditions -> array(
        'id' -> $customer_id),
    contain -> array(
        'Sale' -> array(
            'Car', 'Engine'))));

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

0 голосов
/ 08 сентября 2010

Я думаю, что ваши модельные отношения (и cdburgess) неверны.Это должно выглядеть так:

Customer hasMany Sale
Sale belongsTo Customer
Car hasMany Sale
Sale belongsTo Car
Engine hasMany Sale
Sale belongsTo Engine

Затем вы можете использовать поведение Containable для извлечения всех связанных данных:

$this->Customer->Behaviors->attach('Containable');
$this->recursive = -1;
$this->Customer->find('first', array(
    'conditions' => array('id' => $ID),
    'contain' => array('Sale' => array('Car', 'Engine'))
));
...