我正试图做同样的事情:

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中,子查询被视为一列,但我不确定如何在这里将其串在一起。谢谢你的帮助。

最佳答案

我强烈建议您使用雄辩的,而不是纯sql。这是拉腊维尔最美丽的东西之一。两个模型和关系就这样完成了!如果您需要像那样使用纯sql,请将其全部放入DB::raw中。它更容易,更简单,而且(讽刺的是)不那么乱!
对于模型,您可以使用两个表(由模型本身表示)之间的关系,并说(到目前为止,我了解)品牌属于产品,图像属于产品。请看一下关于laravel的Eloquent's文档。可能会更清楚。
一旦关系结束,你只能说你想得到

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

这和更好地看雄辩的文件应该有助于你做这项工作。
备注:在发送代码并由head编写之前,我没有测试代码,但我认为它是有效的。

关于php - Laravel 4从子查询中的另一个表中选择列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19613309/

10-12 05:29