我有3张桌子:
*document* [id, core_document]
*person* [id, name]
*documentPersonsRole* [document_id, person_id, role] (where role could be accused or victim)
是否可以创建一个快速方法来从“多对多”关系中返回第一条记录?这是我的代码,来自模型文件:
public function documentPersonsRole()
{
return $this->belongsToMany('App\Models\Person', 'document_person_role')
->withPivot('role')
->withTimestamps();
}
public function accused()
{
return $this->belongsToMany('App\Models\Person', 'document_person_role')
->withPivot('role')
->wherePivot('role', 'accused')
->withTimestamps();
}
public function victim()
{
return $this->belongsToMany('App\Models\Person', 'document_person_role')
->withPivot('role')
->wherePivot('role', 'victim')
->withTimestamps();
}
当我这样称呼时:
App\Models\Document::with('accused')->first()
=> App\Models\Document {#3118
id: 1,
core_document: "Iure aut eum aut ex et. Magni aliquam illo voluptatem non repellat. Maxime occaecati reiciendis veniam quod neque reiciendis dolores. Eaque quis molestiae dolorem. Et rerum veniam animi sit beatae inventore voluptas. Aut ea atque nulla quis quam incidunt iusto voluptas. Aut corrupti voluptas minima unde dicta vero aut veritatis. Voluptas vitae nam mollitia quasi porro id quod ut.",
accused: Illuminate\Database\Eloquent\Collection {#3127
all: [
App\Models\Person {#3139
id: 41,
name: "Jamie",
pivot: Illuminate\Database\Eloquent\Relations\Pivot {#3138
document_id: 1,
person_id: 41,
role: "accused",
created_at: "2018-10-24 03:55:23",
updated_at: "2018-10-24 03:55:23",
},
},
],
},
}
您会看到 被指控 是一个只有一个记录的集合,当我在客户端收到此记录时,我必须从数组中提取该记录,但是我想处理对象。
当我尝试这样的事情时:
public function accused()
{
return $this->belongsToMany('App\Models\Person', 'document_person_role')
->withPivot('role')
->wherePivot('role', 'accused')
->withTimestamps()->first();
}
这是我得到的错误:
BadMethodCallException,并显示消息“调用未定义的方法Illuminate / Database / Query / Builder :: addEagerConstraints()”
我该如何使用first()来检索和反对被告而不是使用具有一条记录的数组。
答案 0 :(得分:1)
您如何访问它?
您可能必须直接调用该方法,而不是让Laravel尝试通过魔术方法动态获取它:
$accused = $document->accused()
或者,定义一个accessor:
public function getAccusedAttribute() {
return $this->belongsToMany('App\Models\Person', 'document_person_role')
->withPivot('role')
->wherePivot('role', 'accused')
->withTimestamps()
->first();
}
哪个可以允许您使用$accused = $document->accused
;
通常,当您定义返回关系的方法bar()
时,当您调用$foo->bar
时,Laravel将钩住PHP中的__get()
魔术方法以在后面的某个地方调用bar()->get()
现场。由于您已经通过在关系上使用first()
来运行查询,因此Laravel期望一个关系可以针对该关系运行查询,但是最终获得了模型。
编辑:
如果您仍然希望能够渴望加载关系,请使用另一种方法:
在文档中:
public function accusedPeople()
{
return $this->belongsToMany('App\Models\Person', 'document_person_role')
->withPivot('role')
->wherePivot('role', 'accused')
->withTimestamps();
}
public function getFirstAccusedAttribute()
{
return $this->accusedPeople
->first();
}
在控制器中:
// If you're eager loading, the relationship to eager load is `accusedPeople`
$document = Document::with('accusedPeople')->first();
// The accused person is accessed with the `first_accused` property
$accused = $document->first_accused;
// if you're returning the model directly for json:
// $document->append('first_accused');
答案 1 :(得分:0)
尝试一下:
App\Models\Document::with(['accused' => function($query){
$query->first();
}])->first()
这将查询accused
仅返回第一行。