Laravel подзапрос (выбрать) в БД: Raw - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь отобразить любимые статьи пользователя. И для каждой статьи я хочу указать количество пользователей, добавивших его в избранное

. Я пытался использовать этот код:

$result = $result->join('favorite_clothes', 'favorite_clothes.clothe_id', '=', 'clothes.id');
$result = $result->Where('favorite_clothes.user_id', '=', Auth::user()->id);
$result = $result
->groupBy('clothes.id')
->get(["clothes.id", DB::raw("count(favorite_clothes.id) as favorite_count"), "clothes.name"])
->toArray();

, но в этом случае favorite_count всегда один (1). Я думаю, что я могу решить это с помощью подзапроса в DB:raw(), как

DB::raw("SELECT count(favorite_clothes.id) as favorite_count from favorite_clothes where favorite_clothes.clothe_id = clothes.id")

Но это не работает. Есть ли другой путь ? спасибо.

Ответы [ 3 ]

0 голосов
/ 02 мая 2020

если у вас есть отношения на ваших моделях:

$user = User::find(1);

foreach($user->favoriteClothes As $favoriteClothe)
{
 $numberOfFavoriteWithSameClothe = $favoriteClothe->users->count();
}

Обновление для короткого запроса

User::find(1)->with(['favoriteClothes' => function ($q) {
    $q->withCount('users');
}])->find();
0 голосов
/ 02 мая 2020

Я нашел решение, мне пришлось дважды присоединиться к одной и той же таблице.
первый : получить только избранные продукты текущего пользователя,
второй : получить пользователей которые поместили его в избранное.

$result = $result->join('favorite_clothes', 'favorite_clothes.clothe_id', '=', 'clothes.id');
$result = $result->join('favorite_clothes as fc_for_count', 'favorite_clothes.clothe_id', '=', 'clothes.id');
$result = $result->Where('favorite_clothes.user_id', '=', Auth::user()->id);
$result = $result->groupBy('clothes.id')
                 ->get(["clothes.id", DB::raw("count(fc_for_count.id) as favorite_count"), "clothes.name"])
                 ->toArray();

спасибо.

0 голосов
/ 02 мая 2020

Я хочу, чтобы для каждой статьи количество пользователей, добавивших ее в избранное

Я думаю, что вы хотите:

select clothe_id , count(*) no_users
from favorite_clothes
group by clothe_id 

Если вы хотите отобразить название одежды, а не ее идентификатор, тогда:

select c.name, count(*) no_users
from favorite_clothes fc
inner join clothes c on c.id = fc.clothe_id
group by fc.clothe_id, c.name
...