3

私はこれと同等のことをしようとしています:

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 では、サブクエリは列として扱われますが、ここでそれをつなぎ合わせる方法がわかりません。これについて助けてくれてありがとう。

4

1 に答える 1

1

純粋な SQL ではなく、Eloquent を使用することを強くお勧めします。これは、Laravel で最も美しいものの 1 つです。2 つのモデルと関係、それで完了です。そのような純粋なSQLを使用する必要がある場合は、すべてDB::raw. それはより簡単でシンプルで、(皮肉なことに) 散らかっていません!

モデルを使用すると、(モデル自体で表される) 2 つのテーブル間のリレーションを使用して、(これまでのところ) BrandsProductsに属し、ImagesProductに属していると言うことができます。Laravel に関するEloquent のドキュメントを参照してください。おそらくより明確になるでしょう。

関係が終わったら、あなたはあなたが欲しいと言うことができます

$product = Product::where(function ($query) use ($brand){
                      $brand_id = Brand::where('brand', '=', $brand)->first()->id;
                      $query->where('brand_id', '=', $brand_id);
                  })
                  ->image()
                  ->get();

それとEloquentのドキュメントをよく見ると、仕事をするのに役立つはずです。

PS: 送信する前にコードをテストせず、頭で書きましたが、動作すると思います。

于 2013-10-27T05:10:45.303 に答える