cakePHP 3:多连接

cakePHP 3:多连接,cakephp,associations,inner-join,query-builder,cakephp-3.x,Cakephp,Associations,Inner Join,Query Builder,Cakephp 3.x,我在使用CakePHP 3.x处理表之间的关系时遇到问题。我正在努力在两个以上级别的表之间创建realcionamento realcionamento。 我将介绍关系代码,以及我正在进行的查询,以便更清楚地了解什么是行为关系: class CircuitosTable extends Table{ public function initialize(array $config) { $this->table('circuitos'

我在使用CakePHP 3.x处理表之间的关系时遇到问题。我正在努力在两个以上级别的表之间创建realcionamento realcionamento。 我将介绍关系代码,以及我正在进行的查询,以便更清楚地了解什么是行为关系:

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
提交的查询无法正常工作。应该怎么做?

使用单独的查询查询许多关联,因此使用contain来包含Atividades将不会在主查询中包含该表

看起来您希望按关联数据进行筛选,因此只需使用Query::matching或Query::innerJoinWith即可省去很多麻烦。这将根据需要加入关联的表

以下内容将创建一个与您似乎要查找的内容类似的查询:

$circuitos = $CircuitosTable
    ->find()
    ->innerJoinWith('Atividades.Tiposexercicios')
    ->where([
        'Circuitos.id_plano_treino' => $idPlano
    ])
    ->group('Circuitos.id');
选择 - ... 从…起 迂回 内连接 在Circuitos.id=Atividades.id\u circuito上 内部连接tipos_exercicios Tiposexercicios 关于tiposexerciciios.id=Atividades.id\u tipo\u exercicio 哪里 Circuitos.id\u plano\u treino=123 分组 Circuitos.id 分组是必需的,否则您可能会收到重复的结果

另见


另一方面,联接定义中的表键用于保存实际的数据库表名,根据表类,它是tipos_exercios

太好了!你救了我所有的麻烦!我真的很难使用多个关系或更高层次的关系。非常感谢。我仍然有这个模型的问题,我只能返回数据ciruitos表。我尝试使用->选择搜索所有表中的所有字段,但没有成功。困难在于如何返回并在视图中阅读。@VainerCesario您真正想做的是什么?按关联数据过滤?检索关联数据?两者?从关系中的所有表返回数据。例如,需要返回Circuitos表的nome字段、tipo表Atividades字段和tipoexercios表的nome字段,并显示在视图中的列表上。我的困难是在返回数组中查找数据。