2015-06-08 2 views
0

У меня есть две таблицы:Удалить ненужные включается в CakePHP 3 пагинация

Books 
    id 
    publisher_id 
Publishers 
    id 
    name 

Книги связана с издательством в BooksTable классе, как так:

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.
Есть ли причина, по которой это не удаляется, и есть ли способ сказать ему игнорировать определенные ассоциации при запросе счетчика строк?

+0

'LEFT JOIN' необходимо, потому что, когда вы выполняете левое, присоединитесь к счету строк ** больше ** или равному количеству строк в таблице ВЛЕВО. так что это правильно. Если вам нужен пример, дайте мне знать. – jagad89

+0

Не могли бы вы объяснить, не является ли издателем просто дополнительные данные? Я не вижу, как это повлияет на количество строк. – cmann

+0

См. Ответ ниже. – jagad89

ответ

0

Скажем, например, следующие данные для вашей таблицы.

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 книги.

+0

ОК спасибо, я никогда не думал о случае, когда publisher_id не уникален. Я буду отмечать это как ответ, но если вы или кто-либо еще могли бы прокомментировать, я все равно хотел бы знать, есть ли способ сказать CakePHP исключить объединения, которые, как мы знаем, будут уникальными. – cmann

+0

@cmann Я бы хотел помочь вам, но я не знаю cakePHP. – jagad89