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 подзапрос обрабатывается КАК столбец, но я не уверен, как связать это вместе здесь. Спасибо за любую помощь в этом.

Author: Jazzy, 2013-10-27

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.: Я не тестировал код перед отправкой и написал его в голове, но я думаю, что он работает.

 1
Author: Dennis Braga, 2015-06-26 16:49:01