问题描述
我的数据库中有这个关系表:
id,被引用为:“attivitaSost”(和 attivitaSpostata)。 关系是“可选的”,因此外键可以为空。 不过既然问题一样,我就先尝试解决第一个关系。
我的模型“cciActivities”有这两种方法:
public function attOrig()
{
return $this->hasOne(CcieActivity::class,'id','attivitaSost');
}
public function attSpost(){
return $this->belongsTo(CcieActivity::class,'attivitaSost','id');
如果我设置了逆:
public function attOrig()
{
return $this->hasOne(CcieActivity::class,'id');
}
不起作用,并进入一个无限循环,即 500。
写得好吗?谁需要携带外键?孩子还是家长?有一个标准,或者我按照自己的想法工作:
-
保存新模型,
-
拿起身份证,
-
将其保存在父模型上,
代码:
$ccieActpadre= CcieActivity::where('id',$ccieActivityId)->first();
$ccieActivityNew = CcieActivity::create($data);
$ccieActpadre -> attivitaSost = $ccieActivityNew->id;
$ccieActpadre->save();
我问这个,因为当我尝试应用像
这样的方法过滤器时$ccieActivities = CcieActivity::doesntHave('attOrig')
->get();
返回的不是我所期望的。
当我尝试呈现资源活动时,我使用了一个 api 资源,例如:
return [
'id' => $this->id,'project' =>new ProjectResource($this->project),//id,nomeEnte,name,email,ruolo
'catAttivita' => $this->catAttivita,'nomeAttivita' => $this->nomeAttivita,'descrizione' => $this->descrizione,'dataInizioPrevista' => $this->dataInizioPrevista,'dataFinePrevista'=> $this->dataFinePrevista,'numNegoziAderentiPrevisti'=> $this->numNegoziAderentiPrevisti,'numAziendeCoinvoltePreviste'=> $this->numAziendeCoinvoltePreviste,'numInfluencerPartecipantiPrevisti'=> $this->numInfluencerPartecipantiPrevisti,'numBuyerPrevistiB2B'=> $this->numBuyerPrevistiB2B,'budgetTotalePrevisto'=> $this->budgetTotalePrevisto,'modalitaRealizzazionePrevista'=> $this->modalitaRealizzazionePrevista,'attivitaSpostata' => new CcieActivityResource($this->attOrigSpost),'attivitaSostituitaaaaa' => new CcieActivityResource($this->attOrig),];
这部分
'attivitaSostituita' => new CcieActivityResource($this->attOrig),
永远行不通!不管我用什么方法!
所以我需要了解哪个是在 laravel 模型上管理 1:1 可选自我关系的正确约定,谢谢。
解决方法
hasOne
和 belongsTo
的第二个参数不同。
belongsTo
用于相关模型,hasOne
用于本地模型
$this->hasOne(Phone::class,'foreign_key','local_key');
$this->belongsTo(User::class,'owner_key');
就您而言,hasOne
的参数有误。改成
public function attOrig()
{
return $this->hasOne(CcieActivity::class,'attivitaSost','id');
}
编辑: 永远不要eager load by default 子模型中的父模型和父模型中的子模型,即使它们是单独的类。会导致无限循环。