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:如果通过查询关系存在关系,则选择行的主要内容,如果未能解决你的问题,请参考以下文章
通过 id 获取记录并使用 Laravel 和 eloquent 查询与“中间”的关系
通过findMany选择列并在Laravel的Eloquent中保持关系