Laravel 4:如果通过查询关系存在关系,则选择行

Posted

技术标签:

【中文标题】Laravel 4:如果通过查询关系存在关系,则选择行【英文标题】:Laravel 4: Select row if a relation exists by querying relation 【发布时间】:2013-10-04 08:57:08 【问题描述】:

我正在尝试查询产品表,并希望它在存在关系时返回一个集合。

迭代 1 查询 products 表中的 所有 行,如果 $name 匹配,则延迟加载 metal 表。这是错误的。

我的路线:

Route::group(array('prefix' => 'api/v1'), function()

    Route::controller('products', 'Api\V1\ProductController');
);

我的控制器:

public function getFilter($metal = null) 
    $products = $this->product;
    if ($metal) 
        $products->with('metal', function($query, $metal) 
            $query->where('name', $metal);
        );
    
    return Response::api($products->get());
 

如果metal.name = $metal,我希望 $products 显示。例如类似:

$this->products->where('metal.name', $metal)->get;

使用 Glad To Help 部分答案的解决方案:

这提供了一种替代方法 2,无需连接。

http://paste.laravel.com/WC4

【问题讨论】:

查看docs,参见Eager Load Constraints。尝试将数组传递给 with 函数:$products->with(array('metal' => function($query) use ($metal)... 【参考方案1】:

很遗憾,您还不能在 Eloquent 中一键完成此操作。

但是,有一种方法可以使用反比关系,如下所示:

public function getFilter($metal = null)

    // filter the metals first
    $metals = Metal::with('products')->where('name', '=' , $metal)->get();
    $products = array();
    foreach($metals as $metal)
    
           // collect the products from the filtered metals
           $products = array_merge($products, $metal->products->toArray() );
    
    return $products;

如果这对您来说不是很好的解决方案,您将不得不使用 Fluent 构建查询并手动加入 products x metal 表,或者通过覆盖 newQuery() 方法预先加入它们。

1) 替代方法一。

public function getFilter($metal = null) 
    return DB::table('products')->join('metal', 'products.id', '=' , 'metal.product_id')
                         ->where('metal.name', $name)
                         ->select(array('products.*'));

2) 替代方法二

class Product extends Eloquent

public function newQuery($excludeDeleted = true)
        return parent::newQuery()->join('metal','id','=','metal.product_id');
    


【讨论】:

以上是关于Laravel 4:如果通过查询关系存在关系,则选择行的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent,仅选择存在关系的行

Laravel 4 关系数据库查询

通过 id 获取记录并使用 Laravel 和 eloquent 查询与“中间”的关系

通过findMany选择列并在Laravel的Eloquent中保持关系

Laravel 获取一个查询以检查 QueryBuilder 是不是存在两个关系中的至少一个而不忽略其他过滤器

通过 Laravel 关系查询 HasManyThrough 检索相关记录