Последовательное соединение(innerJoin) таблиц
Подскажите пожалуйста, как сделать объединение 4 таблиц связанных с друг другом последовательно.
Буду очень благодарен за помощь.
$c = $modx->newQuery('newEraObj');
$c->innerJoin('newEraM', 'newEraM');
$c->innerJoin('newEraDtObj', 'newEraDtObj');
$c->innerJoin('newEraDtData', 'newEraDtData', 'id_dt_obj = id_dt_data');
$c->where(array(
'newEraM.id:IN' => $_POST['m_dostup']
));
$c->select('newEraM.id, newEraM.name AS m_name, newEraObj.id AS id_obj, newEraObj.id_m, newEraObj.name AS obj_name, newEraDtObj.id_obj AS id_dt_obj, newEraDtObj.name AS dt_obj_name, newEraDtData.id AS id_dt_data, newEraDtData.id_obj');
$objects = $modx->getCollection('newEraObj', $c);
Работать отказывается.- У меня есть newEraM которая composite по id к newEraObj id_m.
- newEraObj id composite -> newEraDtObj id_obj
- newEraDtObj id composite -> newEraDtData id_obj
Буду очень благодарен за помощь.
Комментарии: 9
Из кода не понятно, но я надеюсь, что классы загружаются через addPackage();
А как тут addPackage() поможет? у меня все сниппеты в ресурсы вставлены. Так что автоматом все добавляет(вроде).
Вот такую штуку сделал.
Вот такую штуку сделал.
$select = 'newEraM.id AS id_m, newEraObj.id AS id_obj, newEraDtObj.id AS id_dt_obj, newEraDtData.id AS id_dt_data, newEraObj.id_m, newEraDtObj.id_obj, newEraDtData.id_obj, newEraM.name AS m_name';
$c = $modx->newQuery('newEraDtData');
$c->select($select);
$c->innerJoin('newEraDtObj','newEraDtObj'); // arguments are: className, alias
$c->innerJoin('newEraObj','newEraObj','newEraDtObj.id_obj = newEraObj.id');
$c->innerJoin('newEraM','newEraM','newEraObj.id_m = newEraM.id');
$c->where(array(
'newEraObj.id_m' => $_POST['m_dostup'],
'newEraDtData.date' => $_POST['date']
));
$objects = $modx->getIterator('newEraDtData', $c);
Если сделать $c->prepare();
$sql = $c->toSQL();
echo "<pre>";
print_r($sql);
echo "</pre>";
и вставить запрос напрямую, то все отлично выдает, но когда пытаюсь $objects = $modx->getCollection('newEraDtData', $c);
foreach ($objects as $object) {
$dt_object = $object->toArray();
echo "<pre>";
print_r($dt_object);
echo "</pre>";
$i++;
}
Он пишет ответ нулевой длины…
Нашел вариант, но почему-то он мне кажется кривым… Почему не работает getCollection?
$c = $modx->newQuery('newEraDtData');
$c->select($select);
$c->innerJoin('newEraDtObj','newEraDtObj'); // arguments are: className, alias
$c->innerJoin('newEraObj','newEraObj','newEraDtObj.id_obj = newEraObj.id');
$c->innerJoin('newEraM','newEraM','newEraObj.id_m = newEraM.id');
$c->where(array(
'newEraObj.id_m' => $_POST['m_dostup'],
'newEraDtData.date' => $_POST['date']
));
$c->prepare();
$sql = $c->toSQL();
$results = $modx->query($sql);
echo "<pre>";
$i=0;
while ($r = $results->fetch(PDO::FETCH_ASSOC)) {
$data[$i]=$r['m_name'];
$i++;
}
echo "</pre>";
print_r($data);
Удалось еще локализовать проблему, но что-то вообще непонятно почему так работает:
$select = 'newEraM.id AS id_m, newEraObj.id AS id_obj, newEraDtObj.id AS id_dt_obj, newEraDtData.id AS id_dt_data, newEraObj.id_m, newEraDtObj.id_obj, newEraDtData.id_obj, newEraM.name AS m_name';
$c = $modx->newQuery('newEraDtData');
$c->select($select);
$c->innerJoin('newEraDtObj','newEraDtObj'); // arguments are: className, alias
$c->innerJoin('newEraObj','newEraObj','newEraDtObj.id_obj = newEraObj.id');
$c->innerJoin('newEraM','newEraM','newEraObj.id_m = newEraM.id');
$c->where(array(
'newEraObj.id_m' => $_POST['m_dostup'],
'newEraDtData.date' => $_POST['date']
));
$objects = $modx->getIterator('newEraDtData', $c);
foreach ($objects as $object) {
echo $object->get('m_name');
}
А если вместо echo $object->get('m_name'); поставить $dt = $object->toArray(); и print_r($dt); то ничего не работает Так что автоматом все добавляетКаким? АК-47?
Я так понял addPackage() это подключение модели и т.д.? У меня связи все работают. Я думал, что это нужно, если вне ресурсов создавать.
А ты разве не создавал модель? Честно говоря, я не понимаю, почему у тебя нет ошибок когда ты делаешь
$c->prepare();
Значит классы где-то подгружаются. Но все равно видимо есть проблема с моделью. Ты как ее делал?
Через modExtra.
Мне кажется, что все же модель в порядке, так как везде в остальных местах, все отлично работает. хотя хз
Мне кажется, что все же модель в порядке, так как везде в остальных местах, все отлично работает. хотя хз
Кажется нашел причину -> выбраны не все строки таблиц. community.modx-cms.ru/blog/modx-xpdo/9693.html
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.