Последовательное соединение(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);
Работать отказывается.

  1. У меня есть newEraM которая composite по id к newEraObj id_m.
  2. newEraObj id composite -> newEraDtObj id_obj
  3. newEraDtObj id composite -> newEraDtData id_obj
Хочу сделать вывод с фильтрами, через ajax. Необходимо, чтобы выводилась последняя таблица newEraDtData.

Буду очень благодарен за помощь.
GrinRom
20 февраля 2015, 09:56
modx.pro
2 079
0

Комментарии: 9

Сергей Шлоков
20 февраля 2015, 14:31
0
Из кода не понятно, но я надеюсь, что классы загружаются через addPackage();
    GrinRom
    20 февраля 2015, 14:37
    0
    А как тут 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++;
    }
    Он пишет ответ нулевой длины…

      GrinRom
      20 февраля 2015, 14:51
      0
      Нашел вариант, но почему-то он мне кажется кривым… Почему не работает 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);
        GrinRom
        20 февраля 2015, 15:10
        0
        Удалось еще локализовать проблему, но что-то вообще непонятно почему так работает:
        $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); то ничего не работает
        Сергей Шлоков
        20 февраля 2015, 15:08
        0
        Так что автоматом все добавляет
        Каким? АК-47?
          GrinRom
          20 февраля 2015, 15:12
          0
          Я так понял addPackage() это подключение модели и т.д.? У меня связи все работают. Я думал, что это нужно, если вне ресурсов создавать.
            Сергей Шлоков
            20 февраля 2015, 15:24
            0
            А ты разве не создавал модель? Честно говоря, я не понимаю, почему у тебя нет ошибок когда ты делаешь
            $c->prepare();
            Значит классы где-то подгружаются. Но все равно видимо есть проблема с моделью. Ты как ее делал?
              GrinRom
              20 февраля 2015, 16:05
              0
              Через modExtra.
              Мне кажется, что все же модель в порядке, так как везде в остальных местах, все отлично работает. хотя хз
      GrinRom
      20 февраля 2015, 15:24
      0
      Кажется нашел причину -> выбраны не все строки таблиц. community.modx-cms.ru/blog/modx-xpdo/9693.html
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        9