cakePHP 3:多连接
cakePHP 3: multi JOIN
我在使用 CakePHP 3.x 处理表之间的关系时遇到了问题。我正在努力在具有 2 个以上级别 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
提交的查询无法正常工作。应该怎么办?
hasMany
关联正在使用单独的查询进行查询,因此使用 contain()
包含 Atividades
将不会在主查询中包含 table。
看来你想通过关联数据进行过滤,所以你只需使用Query::matching()
或Query::innerJoinWith()
就可以省去很多麻烦。这将根据需要加入关联的 table。
以下内容将创建一个类似于您正在寻找的查询:
$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
键用于保存实际数据库 table 名称,根据您的 table 类 , 是 tipos_exercicios
!
我在使用 CakePHP 3.x 处理表之间的关系时遇到了问题。我正在努力在具有 2 个以上级别 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
提交的查询无法正常工作。应该怎么办?
hasMany
关联正在使用单独的查询进行查询,因此使用 contain()
包含 Atividades
将不会在主查询中包含 table。
看来你想通过关联数据进行过滤,所以你只需使用Query::matching()
或Query::innerJoinWith()
就可以省去很多麻烦。这将根据需要加入关联的 table。
以下内容将创建一个类似于您正在寻找的查询:
$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
键用于保存实际数据库 table 名称,根据您的 table 类 , 是 tipos_exercicios
!