如何为具有 1:1 自身关系的模型定义方法
how to define methods for a model that has a 1: 1 self relationship
我的数据库中有这个关系 table:
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,'attivitaSost','id');
}
不起作用,进入无限循环,即 500。
写得好吗?谁需要携带外键? children 还是 parent?有一个标准还是我想的那样工作:
保存新模型,
取id,
保存在parent模型上,
代码:
$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, 'foreign_key', 'owner_key');
在您的情况下,hasOne
的参数有误。改成
public function attOrig()
{
return $this->hasOne(CcieActivity::class, 'attivitaSost', 'id');
}
编辑:
永远不要 eager load by default 子模型中的父项和父模型中的子项,即使它们是分开的 类。这将导致无限循环。
我的数据库中有这个关系 table:
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,'attivitaSost','id');
}
不起作用,进入无限循环,即 500。
写得好吗?谁需要携带外键? children 还是 parent?有一个标准还是我想的那样工作:
保存新模型,
取id,
保存在parent模型上,
代码:
$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, 'foreign_key', 'owner_key');
在您的情况下,hasOne
的参数有误。改成
public function attOrig()
{
return $this->hasOne(CcieActivity::class, 'attivitaSost', 'id');
}
编辑: 永远不要 eager load by default 子模型中的父项和父模型中的子项,即使它们是分开的 类。这将导致无限循环。