首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cakePHP 3:多连接

cakePHP 3:多连接
EN

Stack Overflow用户
提问于 2016-02-24 20:26:33
回答 1查看 995关注 0票数 0

在表与CakePHP 3.x之间的关系上,我遇到了麻烦。我在两个以上的桌子之间努力使现实的闭合性。我将介绍关系的代码和我正在做的查询,以便更清楚地说明什么行为关系:

代码语言:javascript
复制
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'
                    ]
                ]
            ]);
        }

    }

我正在执行以下查询:

代码语言:javascript
复制
$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"]
                                        ]
                                    ]
                        ]);

预期结果:

代码语言:javascript
复制
Select * From Circuitos
JOIN Atividades on Atividades.id_circuito = Circuitos.id
JOIN Tiposexercicios on Tiposexercicios.id = Atividades.id_tipo_exercicio

提交的查询不能正常工作。该怎么办?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-25 07:21:42

hasMany关联正在使用单独的查询进行查询,因此使用contain()包含Atividades将不包括主查询中的表。

看起来,您希望通过关联的数据进行筛选,所以只需使用Query::matching()Query::innerJoinWith()就可以省去很多麻烦。这将在需要时加入相关的表。

下面将创建一个类似于您所要查找的内容的查询:

代码语言:javascript
复制
$circuitos = $CircuitosTable
    ->find()
    ->innerJoinWith('Atividades.Tiposexercicios')
    ->where([
        'Circuitos.id_plano_treino' => $idPlano
    ])
    ->group('Circuitos.id');
代码语言:javascript
复制
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

另外,join定义中的table键用于保存实际的数据库表名,根据您的表类,它是tipos_exercicios

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35612380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档