删除 CakePHP 3 分页中不必要的连接
Remove unnecessary joins in CakePHP 3 pagination
我有两个表:
Books
id
publisher_id
Publishers
id
name
图书与 BooksTable
class 中的出版商相关联,如下所示:
public function initialize(array $config){
$this->belongsTo('Publishers');
}
我想显示图书列表及其出版商,这是我的代码:
$query = $this->Books->find()
->contain('Publishers')
->select(['id', 'title', 'Publishers.name']);
$this->paginate($query);
这工作正常,但我注意到它会产生以下查询:
SELECT * FROM books Books
LEFT JOIN publishers Publishers ON Publishers.id = (Books.publisher_id)
ORDER BY Books.id desc LIMIT 20 OFFSET 0
SELECT (COUNT(*)) AS `count` FROM books Books
LEFT JOIN publishers Publishers ON Publishers.id = (Books.publisher_id)
分页组件会自动从第二个计数查询中删除不需要的代码,例如 GROUP
、ORDER
等,但会保留 LEFT JOIN
.
为什么不删除它是有原因的,有没有办法告诉它在查询行数时忽略某些关联?
举例来说,以下是您的 table.
的数据
Books
id | publisher_id
-----------------
1 | 1
2 | 1
Publishers
id | name
----------
1 | publisher1
1 | publisher2
LEFT JOIN output
book_id | publisher_id | name
-----------------------
1 | 1 | publisher1
1 | 1 | publisher2
2 | 1 | publisher1
2 | 1 | publisher2
我知道,您的情况 publisher_id 是独一无二的。但并非一直如此。现在您可以看到 LEFT JOIN 的行数为 4,而那里只有 2 本书。
我有两个表:
Books
id
publisher_id
Publishers
id
name
图书与 BooksTable
class 中的出版商相关联,如下所示:
public function initialize(array $config){
$this->belongsTo('Publishers');
}
我想显示图书列表及其出版商,这是我的代码:
$query = $this->Books->find()
->contain('Publishers')
->select(['id', 'title', 'Publishers.name']);
$this->paginate($query);
这工作正常,但我注意到它会产生以下查询:
SELECT * FROM books Books
LEFT JOIN publishers Publishers ON Publishers.id = (Books.publisher_id)
ORDER BY Books.id desc LIMIT 20 OFFSET 0
SELECT (COUNT(*)) AS `count` FROM books Books
LEFT JOIN publishers Publishers ON Publishers.id = (Books.publisher_id)
分页组件会自动从第二个计数查询中删除不需要的代码,例如 GROUP
、ORDER
等,但会保留 LEFT JOIN
.
为什么不删除它是有原因的,有没有办法告诉它在查询行数时忽略某些关联?
举例来说,以下是您的 table.
的数据Books
id | publisher_id
-----------------
1 | 1
2 | 1
Publishers
id | name
----------
1 | publisher1
1 | publisher2
LEFT JOIN output
book_id | publisher_id | name
-----------------------
1 | 1 | publisher1
1 | 1 | publisher2
2 | 1 | publisher1
2 | 1 | publisher2
我知道,您的情况 publisher_id 是独一无二的。但并非一直如此。现在您可以看到 LEFT JOIN 的行数为 4,而那里只有 2 本书。