And*_*tis 4 mysql cakephp left-join cakephp-3.0
我有两张桌子。汽车和轮胎。轮胎可以属于汽车。我的表看起来像:
轮胎:
id | car_id
-------------
1 | 17
2 | NULL
Run Code Online (Sandbox Code Playgroud)
汽车:
id | name
-------------
17 | BMW
18 | Mercedes
Run Code Online (Sandbox Code Playgroud)
根据我的理解,如果我想获得所有(!)轮胎(包括它们所属的汽车,如果有的话),则无法创建内部联接(因此,我不能使用Contain)。我需要使用左联接。但是那样我不知道如何自动选择台式车上的所有字段。
查询我:
$query = $this->Tires->find('all');
$query->leftJoin(
['Cars' => 'cars'],
['Cars.id = Tires.car_id']
);
// brings this SQL query
SELECT Tires.id AS `Tires__id`, Tires.car_id AS `Tires__car_id`
FROM tires Tires
LEFT JOIN cars Cars ON Cars.id = Tires.car_id
Run Code Online (Sandbox Code Playgroud)
但是,如何自动从汽车中获取所有字段呢?
UPDATE burzum实际上给了我迅速想详细说明的解决方案,因为我认为蛋糕不能很好地解决它。
为了实现我试图做的事情,我需要添加以下代码:
$query
// you need to pass each model you want to get fields for
->select($this->Tires)
->select($this->Tires->Cars);
Run Code Online (Sandbox Code Playgroud)
轮胎中的汽车如下所示:
...
'Cars' => [
'id' => '17',
'name' => 'BMW'
]
...
Run Code Online (Sandbox Code Playgroud)
如果我做了一个容器,它将看起来像这样:
...
'car' => object(App\Model\Entity\Car) {
'id' => (int) 17,
'name' => 'BMW',
'[new]' => false,
'[accessible]' => [
'*' => true
],
'[dirty]' => [],
'[original]' => [],
'[virtual]' => [],
'[errors]' => [],
'[invalid]' => [],
'[repository]' => 'Cars'
}
...
Run Code Online (Sandbox Code Playgroud)
因此,我可以解决这个问题。不过,我不明白不同的输出...
http://book.cakephp.org/3.0/en/orm/query-builder.html#selecting-all-fields-from-a-table
取自上述网址的示例:
// Only all fields from the articles table including
// a calculated slug field.
$query = $articlesTable->find();
$query
->select(['slug' => $query->func()->concat(['title', '-', 'id'])])
->select($articlesTable); // Select all fields from articles
Run Code Online (Sandbox Code Playgroud)
因此,在您的情况下,您需要将cars表的实例传递给select()调用。
| 归档时间: |
|
| 查看次数: |
1139 次 |
| 最近记录: |