Laravel 4 выберите столбец из другой таблицы в подзапросе
Я пытаюсь сделать эквивалент этого:
select p.id, p.title, b.brand,
(select big from images where images.product_id = p.id order by id asc limit 1) as image
from products p
inner join brands b on b.id = p.brand_id
Вот где я сейчас нахожусь, но это, конечно, не работает:
public function getProducts($brand)
{
// the fields we want back
$fields = array('p.id', 'p.title', 'p.msrp', 'b.brand', 'p.image');
// if logged in add more fields
if(Auth::check())
{
array_push($fields, 'p.price_dealer');
}
$products = DB::table('products as p')
->join('brands as b', 'b.id', '=', 'p.brand_id')
->select(DB::raw('(select big from images i order by id asc limit 1) AS image'), 'i.id', '=', 'p.id')
->where('b.active', '=', 1)
->where('p.display', '=', 1)
->where('b.brand', '=', $brand)
->select($fields)
->get();
return Response::json(array('products' => $products));
}
Я действительно ничего не вижу в документах о том, как это сделать, и, похоже, не могу собрать это воедино из других сообщений.
В "обычном" SQL подзапрос обрабатывается КАК столбец, но я не уверен, как связать это вместе здесь. Спасибо за любую помощь в этом.
1 answers
Я настоятельно рекомендую вам использовать красноречивый, а не чистый SQL. Это одна из самых красивых вещей в Ларавеле. Две модели и отношения, и все готово! Если вам нужно использовать чистый SQL таким образом, поместите все это в DB::raw
. Это проще, проще и (по иронии судьбы) менее грязно!
С моделями вы могли бы использовать отношения между двумя таблицами (представленными самими моделями) и сказать (насколько я понял), что Бренды принадлежат Продуктам и Изображениям принадлежит Продукту . Взгляните на документацию Красноречивого по Laravel. Вероятно, будет более ясно.
Как только отношения закончены, вы можете только сказать, что хотите получить
$product = Product::where(function ($query) use ($brand){
$brand_id = Brand::where('brand', '=', $brand)->first()->id;
$query->where('brand_id', '=', $brand_id);
})
->image()
->get();
Это и более внимательный взгляд на документацию Красноречивого должны помочь вам выполнить эту работу.
P.S.: Я не тестировал код перед отправкой и написал его в голове, но я думаю, что он работает.