2010-09-07 3 views
0

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

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

Customer: $hasMany = 'Sales';

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

Очевидно, что «Автомобиль» и «Двигатель» не имеют sale_id связаны, потому что они могут принадлежать к большому количеству различных продаж.

ответ

1

ЗАКАНЧИВАТЬ Containable поведения, он должен позволить вам сделать все, что вам нужно: http://book.cakephp.org/view/1323/Containable

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

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

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

+0

Ваш код не будет работать - нужно приложить Продажа, автомобиль, двигатель в кавычки. Я также думаю, что это в основном для поиска данных. –

+0

Спасибо, добавили кавычки, а также не хватало закрывающих круглых скобок. Насколько я понял, речь шла о поиске данных. – bjudson

1

Как я понимаю, ваши отношения следующим образом:

Customer -> Sale -> Car -> Engine 

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

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

+0

Только одно предупреждение, использующее более 2 в рекурсивном (даже 2 опасно), может привести к рекурсии, то есть клиент имеет возможность продажи и продажи Balongs для Клиента. Лучший вариант - использовать Containable behavior. –

0

Я думаю, ваша модель отношения (и 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')) 
)); 
Смежные вопросы