2016-02-24 50 views
0

我在使用CakePHP 3.x的表之間的關係時遇到了問題。我正在努力在兩個級別以上的realcionamento表之間製作realcionamento。 我將介紹關係的代碼,也是我正在做的查詢,使之更加明確哪些行爲關係:cakePHP 3:多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表。我嘗試使用 - > Select來搜索所有表中的所有字段,但沒有奏效。困難在於如何返回並在視圖中閱讀。 –

+0

@VainerCesario你究竟想要做什麼?通過關聯數據進行過濾?檢索關聯的數據?都? – ndm