Подзапрос MySQL в Laravel, как объединить запросы и добавить результат второго запроса в качестве нового столбца в первый запрос?

У меня есть две таблицы:

- PRODUCTS (having: ID, NAME, PRICE)
- LIKES (having: ID, PRODID, NAME)

Я хотел бы запросить первую таблицу, подсчитывая (и возвращая как новый столбец) в подзапросе все, что нравится продукту. Как я могу объединить следующие запросы?

$products = DB::table('PRODUCTS')
                  ->get();

$likes = DB::table('LIKES')
                  ->select(DB::raw('count(*) as total'))
                  ->where('PRODID', '=', 'product id from first table')
                  ->get();

Как я могу добиться этого, используя запросы Laravel? Спасибо!


person Edmond Tamas    schedule 30.09.2016    source источник
comment
Не делайте это как подзапрос, соедините две таблицы вместе и сгруппируйте по полям из таблицы продуктов.   -  person Shadow    schedule 30.09.2016
comment
Я пытался, но в таблице LIKES есть несколько строк с одним и тем же PRODID, поэтому, когда я объединяю две строки, строки не будут совпадать. Запрос создаст повторяющиеся строки в моей таблице PRODUCTS.   -  person Edmond Tamas    schedule 30.09.2016
comment
Вот почему вы используете группу. Я могу дать вам решение в sql, но вам нужно перевести его в laravel, потому что я этого не знаю.   -  person Shadow    schedule 30.09.2016
comment
спасибо, попробую так.   -  person Edmond Tamas    schedule 30.09.2016


Ответы (3)


Не тот ответ, который вы специально просили, но в качестве альтернативы с Eloquent было бы очень легко справиться.

$products = Product::with('likes');
foreach ($products as $product) {
    echo 'Number of likes: '.$product->likes->count();
}
person user1669496    schedule 30.09.2016

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

select p.id, p.name, p.price, count(l.id) as likecount
from products p
left join likes l on p.id=l.prodid
group by p.id, p.name, p.price
person Shadow    schedule 30.09.2016

Попробуйте так

$likes = DB::table('LIKES')
      ->join('PRODUCTS', 'LIKES.PRODID', '=', 'PRODUCTS.id') 
      ->select('LIKES.*') 
      ->where('PRODUCTS.id', '=', 3)      
      ->get();
$total_like = count($likes); 
person Komal    schedule 30.09.2016