Laravel模型对象检索关系模型,其中条件没有"得到"方法

时间:2016-12-09 10:18:02

标签: php laravel octobercms

我正在研究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();

}

2 个答案:

答案 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为您提供了一系列产品......

因此...

$productsIlluminate\Support\Collection

的对象

$products->first()调用该类中的first()函数。

有关集合的wherefirst方法的文档......