Laravel - 从数据透视表中获取额外的列值

Posted

技术标签:

【中文标题】Laravel - 从数据透视表中获取额外的列值【英文标题】:Laravel - Get additional column value from pivot table 【发布时间】:2020-06-12 11:55:39 【问题描述】:

我有具有多对多关系的 Stores 和 Medicines 表。使用attachsync 可以正常存储和更新。表结构如下所示。我想检索额外列 (expired) 的值。

store_id | medicine_id | expired
    1         2           1
    1         3           0

我还需要计算像这样过期的药物总数

两个模型都有withPivot('expired') 模型关系。

控制器

public function show($id)

    $medicine = Medicine::findOrFail($id);
    $stores = $medicine->findorfail($id)->stores()->get();
    return view ('medicines', compact('medicine', 'stores'));

查看

我可以用这个列出药物

@foreach ($stores as $store)
 $store->value('name') 
!! $store->pivot->expired == 1 ?
'Expired' : 'Not-Expired' !!
<a href=" route('store', $store->id) ">View</a>
@endforeach

我试着像这样计算城市:

@foreach($stores as $store)
 ($store->pivot->expired==1) 
@endforeach 

它给出 1 1. 我如何计算已过期 Cetamols 的城市总数?

【问题讨论】:

【参考方案1】:

以下应该有效:

Sum 在关系集合上:

$stores->sum('pivot.expired');

Sum 在查询生成器上:

Medicine::findOrFail($id)->stores()->sum('expired');

此外,您的控制器代码目前没有多大意义,可以简化为:

public function show($id)

    $medicine = Medicine::findOrFail($id);
    $stores = $medicine->stores;

    return view('medicines', compact('medicine', 'stores'));

我删除了对findOrFail() 的第二次调用并删除了get(),因为它是不必要的。

【讨论】:

以上是关于Laravel - 从数据透视表中获取额外的列值的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 将其他列值保存到数据透视表

从 Laravel 中的数组向数据透视表中的额外列添加条件值

使用 laravel 查询生成器在另一个表中使用列值

Laravel 5.4:直接从数据库中的列中减去数字

根据 SQL Server 中表中的列值从两个表中获取一个新表:

如何覆盖 bigquery 现有表中的列值