如何从 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

如何在 Laravel 8 中获取与 json 有一个 hasMany 关系的表的所有模型?

orderBy on hasMany 关系 laravel