Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel:如何从3个具有关系的表中获取数据_Laravel_Eloquent_Eloquent Relationship - Fatal编程技术网

Laravel:如何从3个具有关系的表中获取数据

Laravel:如何从3个具有关系的表中获取数据,laravel,eloquent,eloquent-relationship,Laravel,Eloquent,Eloquent Relationship,我有三张桌子: 客户 身份证 名字 销售 客户识别码 销售日期 联系人 客户识别码 联络日期 联系人表中没有任何更新操作。每个进程在联系人表中打开一条新记录。因此,用户可以在contacts表中有多条记录 以下是我在模型中的关系: 客户 public function contacts() { return $this->hasMany(Contact::class); } public function sales() { return $this->

我有三张桌子:

客户

  • 身份证
  • 名字
销售

  • 客户识别码
  • 销售日期
联系人

  • 客户识别码
  • 联络日期
联系人表中没有任何更新操作。每个进程在
联系人
表中打开一条新记录。因此,用户可以在
contacts
表中有多条记录

以下是我在模型中的关系:

客户

public function contacts()
{
    return $this->hasMany(Contact::class);
}

public function sales()
{
    return $this->hasMany(Sale::class);
}
联系方式

public function customer()
{
    return $this->belongsTo('App\Customer', 'customer_id');
}
销售

public function customer()
{
    return $this->belongsTo('App\Customer');
}
我想拥有
联系人
表的最新记录,并将其与其他相关表合并

以下是我尝试过的查询:

$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();
在blade文件中,我在
foreach
循环中得到了一些结果。但是,我无法从
销售
联系人
表中获取相关数据

@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()

有人能帮我显示销售和联系日期吗?或者如何提高代码质量的想法?

我不确定,但您能否尝试执行以下操作:

return Customer::where('is_active', 'YES')
    ->with([
        'sale', 
        'contact' => function ($query) use($record) {
            return $query->whereIn('id', $record)->where('result', 'UNCALLED');
        }
    ])->get();

如果您想要联系人的最新记录,可以在
客户
模型上声明另一种关系,例如:

公共功能最新联系人()
{
返回$this->hasOne(Contact::class)->latest('Contact_date');
}
顺便说一句,如果您有一个
hasMany
,则始终可以声明一个或多个
hasOne
附加关系。使用的外键相同

通过这种方式,您可以检索与您的
客户
型号一起加载的
最新联系人
eager:

$customer=customer::with('latest_contact')->find($id);
或者在查询中使用此关系,类似于:

$customers=Customer::where('is\u active','YES')
->带(‘销售’)
->带('联系人')
->whereHas('last_contact',函数($q){
返回$q->where('result','UNCALLED');
})->get();
或者:

$customers=Customer::where('is\u active','YES')
->带(‘销售’)
->带('联系人')
->带('last_contact',函数($q){
返回$q->where('result','UNCALLED');
})->get();
如果您愿意,您可以使用附加的
(其中
)声明
最后一次联系人

公共功能最新联系人()
{
返回$this->hasOne(Contact::class)
->其中('结果','未调用')
->最新(“联系日期”);
}
这样,所有其他查询都应该更容易。
我希望这能对您有所帮助。

您是否在您雄辩的模型中尝试了
protected$with
属性?快速提示;关系名称应反映返回的结果数量。您有
联系人
销售
,两者都使用
hasMany()
并返回多个联系人,因此这些联系人实际上应该是
联系人
销售
,以避免混淆
customer
很好,因为
belongsTo()
固有地返回一条记录。@TimLewis是的,你是对的。很抱歉拼错了。我改正了,不用担心!也要确保修复引用
$item->sales
而不是
$item->sale
$item->contacts
而不是
$item->contact
@MadameGreenPea您如何将结果发送到视图?这将返回所有活动的
客户
记录,但最初的问题是使用
->where has()
添加额外的筛选,因此,这是一种不正确的方法。您使
->with()
->whereHas()
同时使用
->with()
来限制
->联系人
的返回结果,但忽略它是错误的。谢谢。但是,我仍然无法在视图文件中获取销售日期和联系日期。因此,不幸的是,结果是一样的。我不明白为什么。这个想法很简单:通过一个
hasMany
关系,你可以在同一个模型上声明其他
hasOne
hasMany
,并附加条件,试着利用这个想法和你的数据,你的查询应该会更容易。