0

У меня возникли проблемы с отношениями между таблицами с CakePHP 3.x. Я изо всех сил пытаюсь сделать realcionamento между столами с более чем 2 уровнями realcionamento. я представлю кодекс отношений, а также вопрос, что я делаю, чтобы сделать его более ясным, что поведение отношения:cakePHP 3: multi JOIN

class CircuitosTable extends Table{ 
     public function initialize(array $config) 
     { 
      $this->table('circuitos'); 

      $this->addAssociations([ 
       'belongsTo' => [ 
        'Planostreinos' => [ 
         'foreignKey' => 'id_plano_treino', 
         'joinType' => 'INNER', 
         'bindingKey' => 'id' 
        ] 
       ], 
       'hasMany' => [ 
        'Atividades' => [ 
         'className' => 'Atividades', 
         'foreignKey' => 'id_circuito', 
         'bindingKey' => 'id', 
         'joinType' => 'INNER', 
         'dependent' => false, 
         'cascadeCallbacks' => false, 
         'propertyName' => '_atividades' 
        ], 
       ] 
      ]); 

     } 
    } 


class AtividadesTable extends Table{ 
     public function initialize(array $config) 
     { 
      $this->table('atividades'); 

      $this->addAssociations([ 
       'belongsTo' => [ 
        'Tiposexercicios' => [ 
         'foreignKey' => 'id_tipo_exercicio', 
         'joinType' => 'INNER', 
         'bindingKey' => 'id' 
        ], 
        'Circuitos' => [ 
         'foreignKey' => 'id_circuito', 
         'joinType' => 'INNER', 
         'bindingKey' => 'id' 
        ] 
       ] 
      ]); 

     } 
    } 

class TiposexerciciosTable extends Table{ 

     public function initialize(array $config) 
     { 
      $this->table('tipos_exercicios'); 

      $this->addAssociations([ 
       'hasMany' => [ 
        'Atividades' => [ 
         'className' => 'Atividades', 
         'foreignKey' => 'id_tipo_exercicio', 
         'bindingKey' => 'id', 
         'joinType' => 'INNER', 
         'dependent' => false, 
         'cascadeCallbacks' => false, 
         'propertyName' => '_atividades' 
        ] 
       ] 
      ]); 
     } 

    } 

Я делаю этот запрос:

$circuitos = $CircuitosTable->find('all', [ 
         'conditions' => ['id_plano_treino' => $idPlano], 
         'contain' => ['Atividades'], 
         'joins' => [ 
             [ 
              "table" => "Tiposexercicios", 
              "alias" => "TipoExercicio", 
              "type" => "INNER", 
              "conditions" => ["TipoExercicio.id = Atividades.id_tipo_exericio"] 
             ] 
            ] 
         ]); 

Ожидаемый результат:

Select * From Circuitos 
JOIN Atividades on Atividades.id_circuito = Circuitos.id 
JOIN Tiposexercicios on Tiposexercicios.id = Atividades.id_tipo_exercicio 

Представленный запрос не работает должным образом. Как это сделать?

ответ

0

hasMany ассоциации запрашиваются с использованием отдельного запроса, поэтому использование contain() для включения Atividades не будет включать таблицу в основной запрос.

Похоже, вы хотите фильтровать связанные данные, поэтому вы можете сэкономить массу неприятностей, просто используя Query::matching() или Query::innerJoinWith(). При необходимости они присоединятся к связанным таблицам.

Следующая будет создать запрос, похожий на то, что вы, кажется, ищет:

$circuitos = $CircuitosTable 
    ->find() 
    ->innerJoinWith('Atividades.Tiposexercicios') 
    ->where([ 
     'Circuitos.id_plano_treino' => $idPlano 
    ]) 
    ->group('Circuitos.id'); 
SELECT 
    -- ... 
FROM 
    circuitos Circuitos 
    INNER JOIN atividades Atividades 
    ON Circuitos.id = (Atividades.id_circuito) 
    INNER JOIN tipos_exercicios Tiposexercicios 
    ON Tiposexercicios.id = (Atividades.id_tipo_exercicio) 
WHERE 
    Circuitos.id_plano_treino = 123 
GROUP BY 
    Circuitos.id 

Группировка требуется, как вы можете в противном случае получить повторяющиеся результаты.

Смотрите также Cookbook > Database Access & ORM > Retrieving Data & Results Sets > Filtering by Associated Data

На боковой ноте table ключ в определении присоединения Мента провести фактическую базу данных имя таблицы, которая, в соответствии с вашими классами таблицы, является tipos_exercicios!

+0

Отлично! Вы сохранили все мои проблемы! У меня действительно возникли проблемы с использованием нескольких отношений или более уровней связей. Спасибо! –

+0

У меня все еще проблема с этой моделью, я могу только вернуть таблицу данных ciruitos. Я попытался использовать -> Выбрать, чтобы искать все поля из всех таблиц, но не работал. Трудность заключается в том, как возвращаться и читать в представлении. –

+0

@VainerCesario Что вы на самом деле хотите сделать? Фильтрация по связанным данным? Получение связанных данных? И то и другое? – ndm