如何为具有 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?有一个标准还是我想的那样工作:

代码:

                $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 可选自我关系的正确约定,谢谢。

hasOnebelongsTo的第二个参数不一样

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 子模型中的父项和父模型中的子项,即使它们是分开的 类。这将导致无限循环。