如何从 Laravel 中的 hasMany() 关系中获取所有结果?
Posted
技术标签:
【中文标题】如何从 Laravel 中的 hasMany() 关系中获取所有结果?【英文标题】:How do I get all of the results from a hasMany() relationship in Laravel? 【发布时间】:2014-03-02 17:14:26 【问题描述】:例如,我有一个产品,我有一个 BaseProduct。
在产品的模型中,我指定了以下内容:
//In class Product
public function BaseProduct()
return $this->belongsTo("BaseProduct", "BaseProductId");
在 BaseProduct 中,我指定了以下关系:
//In class BaseProduct
public function Products()
return $this->hasMany("Product", "ProductId");
如果我要选择一个产品,像这样:
$Product::first()
我可以通过执行以下操作获得 BaseProduct:
$Product::first()->BaseProduct()->get();
我将如何获取 BaseProduct 的 Model
,而不是从中获取结果数组,以便我可以获取 BaseProduct 的所有子级,即所有具有与此 BaseProduct 相关的外键的产品。
我尝试了BaseProduct()->all();
,但这不是一个有效的方法。
编辑:
我创建了以下函数调用链 - 但它很糟糕。
return BaseProduct::find(Product::first()->BaseProduct()->getResults()['BaseProductId'])->Products()->getResults();
最终编辑:
我在BaseProduct
模型中犯了一个错误。在Products()
函数中,我指定了return $this->hasMany("Product", "ProductId");
,其中ProductId
应该是BaseProductId
。
修复后,我可以成功使用:
Product::first()->BaseProduct->products;
正如 Sheikh Heera 所解释的那样。
【问题讨论】:
类似:$product->BaseProduct()->first()->products ? 不幸的是,这导致BadMethodCallException
,因为BaseProduct()
返回一个BelongsTo
对象,根据the documentation
【参考方案1】:
要获得BaseProduct
的孩子,你可以试试这个:
$bp = BaseProduct::with('Products')->get();
现在,你有一个BaseProduct
的集合,所以你可以使用这样的东西:
$bp->first()->products
或者从集合中获取第二个项目
$bp->get(1)->products
另外,你可以像这样运行一个循环(很可能在通过它之后的视图中):
// From the controller
$bp = BaseProduct::with('Products')->get();
return View::make('view_name')->with('baseProduct', $bp);
在View
@foreach($baseProduct->products as $product)
$product->field_name
@endforeach
更新:是的,你可以试试这个
$product = Product::first();
$baseProduct = $product->BaseProduct;
// Dump all children/products of this BaseProduct
dd($baseProduct->products->toArray());
你可以像这样链接:
Product::first()->BaseProduct->products;
更新:您的表结构应如下所示:
表:基础产品:
id(pk) | some_field | another_field
表格:产品:
id(pk) | baseproduct_id(fk) | another_field
根据这个表结构,关系应该是
// BaseProduct
public function Products()
return $this->hasMany("Product");
// Product
public function Products()
// second parameter/baseproduct_id is optional unless
// you have used something else than baseproduct_id
return $this->belongsTo("BaseProduct", "baseproduct_id");
【讨论】:
嗯 - 这真的很接近,谢谢你的回答。本质上,我要做的是首先获取一个产品,然后从该产品中获取 BaseProduct,然后从该 BaseProduct 中获取所有以该 BaseProduct 作为其 BaseProduct 的产品。是否可以从第一次拥有产品开始使用您的方法,而不是先获得 BaseProduct? 不幸的是,这会导致BadMethodCallException
。我确实执行了我想要的,并且我更新了我的问题,但这是一个非常丑陋的链接函数调用。
你肯定搞错了,反正链子是你衍生出来的,不可怕IMO
,很聪明。
啊!您的回答return Product::first()->BaseProduct->Products;
确实有效!我在 BaseProduct 模型中犯了一个错误。在Products()
函数中,我指定了return $this->hasMany("Product", "ProductId");
,其中ProducId
应该是BaseProductId
!
即使在这篇文章发布四年后,这对我帮助很大!我只是想向@the-alpha 大声喊出一个很好的答案!【参考方案2】:
$product = Product::find('id');
$baseProduct = $product->baseProduct()->getModel();
$baseProduct->products()->getModels();
【讨论】:
去掉最后一行 $baseProducts 上多余的 's'以上是关于如何从 Laravel 中的 hasMany() 关系中获取所有结果?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 laravel 的 eloquent 集合中获取外键
Laravel Eloquent 中的多级深度 hasMany 关系
Laravel:如何平均嵌套 hasMany 关系(hasManyThrough)
如何在 Laravel 的 hasMany 关系中使用 groupBy