【发布时间】:2020-01-06 11:04:26
【问题描述】:
我有 3 张桌子:
Customers
- 身份证
- 姓名
Sales
- customer_id
- 销售日期
Contacts
- customer_id
- 联系日期
contacts 表中没有任何更新操作。每个进程在contacts 表中打开一条新记录。因此,一个用户在contacts 表中可以有多个记录。
这是我在模型中的关系:
Customer
public function contacts()
{
return $this->hasMany(Contact::class);
}
public function sales()
{
return $this->hasMany(Sale::class);
}
Contact
public function customer()
{
return $this->belongsTo('App\Customer', 'customer_id');
}
Sale
public function customer()
{
return $this->belongsTo('App\Customer');
}
我想获得contacts 表的最新记录,并使其与其他相关表连接。
这是我尝试过的查询:
$record = Contact::groupBy('customer_id')
->select(DB::raw('max(id)'));
$result = Customer::query();
$result->where('is_active', 'YES');
$result->with('sales');
$result->whereHas('contacts', function ($q) use($record){
return $q->whereIn('id', $record)->where('result', 'UNCALLED');
});
return $result->get();
在刀片文件中,我在foreach 循环中得到了一些结果。但是,我无法从sales 和contacts 表中获取相关数据。
@foreach($result as $item)
@foreach($item->sales as $sale) // Has no output and gives error: Invalid argument supplied for foreach()
@foreach($item->contacts as $contact) // Has no output and gives error: Invalid argument supplied for foreach()
谁能帮助我如何显示销售和联系日期?或者对如何提高此代码质量有任何想法?
【问题讨论】:
-
你有没有在你的 eloquent 模型中尝试过
protected $with属性? -
快速笔记;关系名称应反映返回的结果数量。你有
contact和sale,它们都使用hasMany()并且返回不止一个,所以它们真的应该是contacts和sales以避免混淆。customer很好,因为belongsTo()固有地返回一条记录。 -
@TimLewis 是的,你是对的。抱歉拼错了。我更正了。
-
别担心!只要确保也修复参考;
$item->sales而不是$item->sale和$item->contacts而不是$item->contact -
@MadameGreenPea 你如何将结果发送到视图?
标签: laravel eloquent eloquent-relationship