微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何为具有 1:1 自我关系的模型定义方法

如何解决如何为具有 1:1 自我关系的模型定义方法

我的数据库中有这个关系表:

enter image description here

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

解决方法

hasOnebelongsTo 的第二个参数不同。

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 子模型中的父模型和父模型中的子模型,即使它们是单独的类。会导致无限循环。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。