Я пытаюсь воспроизвести этот результат SQL-запроса, который работает:
SELECT r.id, r.day, s.ddbroute_id, s.delivery_id, d.id, d.laststatusid, t.id, t.delivery_id, t.statusstage_id, st.id, st.stage
FROM ddbroutes r
LEFT JOIN ddbrouteslots s on r.id = s.ddbroute_id
LEFT JOIN deliveries d on s.delivery_id = d.id
LEFT JOIN trackingstatuses t on d.laststatusid = t.id
LEFT JOIN statusstages st on t.statusstage_id = st.id
Я использую модели CakePHP 2 с
- bindModel для изменения ассоциаций модели на лету
- custom Find поместите логику в модель
Общего поля из нижней таблицы за пределами второго уровня нет. Сообщение об ошибке: "Модель "Ddbroute" не связана с моделью "Доставка"." Поэтому я пробовал его с доставкой и без нее в массиве «содержать», и никоим образом не вводил поля «Доставка». Я был бы рад использовать соединения, если это уместно. Я прочитал самые релевантные сообщения на StackOverflow, которые смог найти.
Мой код с дополнительной информацией приведен ниже. Будем признательны за любую помощь.
У меня есть пять таблиц (включая следующие поля):
ddbroutes (id, day)
ddbrouteslots (id, ddbroute_id, delivery_id)
deliveries (id, laststatusid)
trackingstatuses (id, statusstage_id)
statusstages (id, stage)
В моделях установлены следующие отношения:
Ddbroute hasMany Ddbrouteslot (Ddbrouteslot belongsTo Ddbroute)
Delivery hasOne Ddbrouteslot (Ddbrouteslot belongsTo Delivery)
Delivery hasMany Trackingstatus (Trackingstatus belongsTo Delivery)
Statusstage hasMany Trackingstatus (Trackingstatus belongsTo Statusstage)
Несмотря на то, что у доставки есть один Ddbrouteslot (и это будет hasMany — исправлено — теперь остается hasOne), для каждого отдельного Ddbroute существует только одна доставка, связанная с каждым Ddbrouteslot. Контейнер настроен во всех моделях. Я не знал, нужно ли мне сначала использовать unbindModel (это не изменило сообщение об ошибке).
Мой код в файле модели Ddbroute.php (только до таблицы доставки)
public $findMethods = array('ddbstatuses' => true);
protected function _findDdbstatuses($state, $query, $results = array()) {
if ($state === 'before') {
$ddbrouteslotmodel = ClassRegistry::init('Ddbrouteslot');
$ddbrouteslotmodel->unbindModel(
array('belongsTo' => array('Delivery'))
);
$ddbrouteslotmodel->bindModel(
array('hasOne' => array(
'Delivery' => array(
'className' => 'Delivery',
'foreignKey' => 'id',
'dependent' => false,
'fields' => array(
'id', 'laststatusid'
)
)
))
);
$deliverymodel = ClassRegistry::init('Delivery');
$deliverymodel->unbindModel(
array('hasOne' => array('Ddbrouteslot'))
);
$deliverymodel->bindModel(
array('belongsTo' => array(
'Delivery' => array(
'className' => 'Delivery',
'foreignKey' => 'delivery_id'
)
)
)
);
$query['contain'] = array(
'Ddbrouteslot', 'Delivery'
);
return $query;
}
return $results;
}
В другом контроллере для запуска операции поиска:
$this->LoadModel('Ddbroute');
$ddbstatuses = $this->Ddbroute->find('ddbstatuses');
$this->set(compact('ddbstatuses')); // to make available in a view
Я также предпринял еще одну попытку с длинным массивом соединения, но запрос не принес никакой информации о доставке, статусе отслеживания или статусе, хотя запрос, похоже, был выполнен.
public $findMethods = array('ddbstatuses' => true);
protected function _findDdbstatuses($state, $query, $results = array()) {
if ($state === 'before') {
ClassRegistry::init('Delivery'); // not sure these three lines were needed so I tried with and without them
ClassRegistry::init('Trackingstatus');
ClassRegistry::init('Statusstage');
$query['joins'] = array(
array(
'table' => 'ddbrouteslots',
'alias' => 'Ddbrouteslot',
'type' => 'LEFT',
'conditions' => array(
'Ddbroute.id = Ddbrouteslot.ddbroute_id'
)),
array(
'table' => 'deliveries',
'alias' => 'Delivery',
'type' => 'LEFT',
'conditions' => array(
'Ddbrouteslot.id = Delivery.id'
)),
array(
'table' => 'trackingstatuses',
'alias' => 'Trackingstatus',
'type' => 'LEFT',
'conditions' => array(
'Delivery.laststatusid = Trackingstatus.id'
)),
array(
'table' => 'statusstages',
'alias' => 'Statusstage',
'type' => 'LEFT',
'conditions' => array(
'Trackingstatus.statusstage_id = Statusstage.id'
))
);
$query['contain'] = array(
'Ddbrouteslot',
'Delivery', // Not sure I should be adding these other models, so I tried with and without them
'Trackingstatus',
'Statusstage'
);
return $query;
}
return $results;
}
'foreignKey' => false, 'conditions' => array('
Delivery.
laststatusid` =Trackingstatus
.id
' )`. Я получил сообщение об ошибке, что laststatusid был неизвестным столбцом. Есть идеи, как ускорить работу? - person nicholasvad   schedule 12.02.2017