在 laravel 中查看多对多关系

Posted

技术标签:

【中文标题】在 laravel 中查看多对多关系【英文标题】:View Many to Many Relationship in laravel 【发布时间】:2021-03-16 04:49:36 【问题描述】:

产品型号代码:

public function categories()

    return $this->belongsToMany(Category::class);

类别型号代码:

public function products()

    return $this->belongsToMany(Product::class);

产品控制器代码:

$products = Product::with('categories')->get();

index.blade.php 代码:

@foreach ($products as $product)
    <li>Product Name: $product->name</li>
    <li>Category:  $product->categories->name </li>
@endforeach

当我使用上面的 index.blade.php 代码时,显示以下错误:

试图获取非对象的属性“名称”。

然后我尝试将 index.blade.php 代码修改为以下内容:

<li>Category:  $product->categories </li>

然后我在 index.blade.php 中得到以下输出:

["id":1,"name":"Cameras"]

我可以知道如何显示与特定产品相关的类别名称吗?

【问题讨论】:

【参考方案1】:

belongsToManyhasMany 表示这有很多相关的模型。对于这些关系,laravel 返回一个集合而不是一个对象。所以你不能像$product-&gt;categories-&gt;name 这样直接得到一个属性,因为类别是这里的一个集合。您必须像

一样遍历集合
@foreach ($product->categories as $category)
     $category->name 
@endforeach

现在您可以访问该产品的所有相关类别并获取它们的属性。

【讨论】:

很高兴有帮助:)【参考方案2】:
@foreach ($products as $product)
  <li>Product Name: $product->name</li>
    <ul>
      @foreach($product->categories as $category)
        <li>Category:  $category->name </li>
      @endforeach
    </ul>
@endforeach

$product-&gt;categories 是 $product 对象的相关类别记录的集合,而不是对象 - 因此出现错误

【讨论】:

【参考方案3】:

由于类别是一个集合,您可以对其进行迭代或从 laravel 集合方法中受益并从中提取您想要的属性。

通过将 pluck 方法的结果转换为数组,您可以将它们内爆并显示为字符串。下面的代码可以帮助你:

implode(', ', $product->categories->pluck('name')->toArray())

【讨论】:

以上是关于在 laravel 中查看多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:无法在视图中显示多对多关系

在事件监听器中同步多对多关系(Laravel 5.7)

在多对多关系中命名表 laravel

Laravel:无法添加记录多对多关系

Laravel5.1 模型 --多对多关系

在 Laravel 中查询用户的多对多关系