Laravel с подсчетом без учета отношения - PullRequest
0 голосов
/ 10 декабря 2018

Моя цель - получить коллекцию книг с количеством совпадений book.names в другой таблице без отношения

Я получаю коллекцию вот так

$books = Books::paginate(20);

Теперь мне нужно получитьколичество совпадений, подобных этому

SELECT COUNT(*) FROM `posts` WHERE `body` LIKE '%book.name%'

Как я могу сделать это одним запросом и избежать ненужных запросов для каждой модели, например, жадной загрузки

1 Ответ

0 голосов
/ 11 декабря 2018

Вы можете сделать это с энергичной загрузкой, не загружая все сообщения.Существует метод, который называется withCount

Books.php

public function posts() {
    return $this->hasMany(Post::class, 'post_id', 'id');
}

Один из способов найти все сообщения, связанные с книгой:

$books = Books::withCount(['posts' => function ($query) use($searchTerm) {
    $query->where('body', 'like', $searchTerm);
}])->get();

//How to retrieve
$book = $books->first()->posts_count.

Вы можете найти больше информации о withCount на веб-сайте документации 1012 *.

Подход 2: Без быстрой загрузки

$books = Books::select('*')->addSelect(DB::raw("SELECT COUNT(*) as post_count FROM `posts` WHERE `body` LIKE '%book.name%' ")->get(); //This will return collection with post_count.

Примечание: не тестировалось

...