我正在研究octoberCMS(laravel框架),我对在where子句上检索关系模型有疑问。
我从"衣服类型"中取出了衣服类型记录。基于其主键" id"的模型。
$clothing_type = ClothingType::where('id',post('clothingtype_id'))->where('status','Active')->first();
这种"服装类型"模型与"产品"模型,关系是=>每种服装类型都有很多产品。
每件事都很好;现在我的业务逻辑有两种情况,一种是获得服装类型的所有产品,另一种是获得服装类型的第一种产品。所以我使用 $ clothing_type->产品来获取所有产品,并使用 $ clothing_type-> products-> first()来获得第一个产品。
现在我必须对这两种情况都适用条件。条件是只有状态为" Active"应该取而代之
$ products = $ clothing_type-> products-> where(' status',' Active'); 和
< strong> $ first_product_detail = $ products-&gt; first(); 。
每件事情都按预期工作,但如果没有&#34; get()&#34; 方法,产品将如何获取。 $ clothing_type-&GT;产品 - 化合物其中(&#39;状态&#39;&#39;主动&#39)的 - &GT;得到();由于我对关系不熟悉,我想知道它是如何工作的,或者这是获取记录或不正确假设的坏方法。但是每件事都很好。
$clothing_type = ClothingType::where('id',post('clothingtype_id'))->where('status','Active')->first();
if(count($clothing_type->products))
{
$products = $clothing_type->products->where('status','Active');
$first_product_detail = $products->first();
}
答案 0 :(得分:3)
你正在以正确的方式做到这一点。当您作为属性访问关系时,Eloquent会自动检索记录。
但是,如果您以关系形式访问该关系,则会获得查询本身,您可以添加过滤器:
if(count($clothing_type->products))
{
$products = $clothing_type->products()->where('status','Active')->get();
$first_product_detail = $products->first();
}
这可以解决您的问题
(documentation is over here (see the first item))
编辑:还要注意第一种方法不是Eloquent的方法,而是来自Collection,它非常强大!
EDIT2: 我误解了你想要知道如何实现这个问题的部分。 Eloquent和Collections都有where方法。我假设你理解了Eloquent的工作,但是Collection中的那个是完全相同的(see documentation on the Collection where here)
我自己更喜欢Eloquent,因为这限制了从数据库中检索的记录数量。但是如果您在代码中稍后需要所有产品(甚至是非活动产品),只需使用Collection方法过滤掉活动产品
答案 1 :(得分:2)
没有什么可以害怕......
first()
和where()
是照明\数据库\查询\构建器以及照明\支持\集合的功能,所有first
都限制记录采取1,然后给你第一个记录。当您使用Builder时,查询将获得1条记录,1则在集合中使用它,所有记录首先是get(),然后返回第一条记录。
在这里,
当你这样做时,
$clothing_type->products
,Laravel为您提供了一系列产品......
因此...
$products
是Illuminate\Support\Collection
和
$products->first()
调用该类中的first()
函数。