自定义 Eloquent 关系,有时 returns $this 模型

Custom Eloquent relation which sometimes returns $this Model

我有一个模型 Text,它有一个称为 pretext() 的一对多关系,return 将一对多关系商店 Text,像这样:

class Text extends Model
{
    public function pretext(){
       return $this->belongsTo('App\Models\Text', 'pretext_id');
    }

   public function derivates(){
      return $this->hasMany('App\Models\Text', 'pretext_id');
   }
}

如果 $text 没有任何借口(在我的场景中,这意味着 $text['pretext_id'] == 0) $text->pretext() 应该 return $text本身。当我尝试

public function pretext(){
   if ( $this->belongsTo('App\Models\Text', 'pretext_id') ) {
       return $this->belongsTo('App\Models\Text', 'pretext_id');
   }
   else {
       return $this;
   }
}

我收到错误

local.ERROR: LogicException: Relationship method must return an object of type Illuminate\Database\Eloquent\Relations\Relation

else 部分执行时。所以我的问题是:

  1. 如何将 $this 转换为 Relation 类型的对象?或者:
  2. 我怎样才能以不同的方式实现我的目标?

试试动态道具

class Text extends Model
{
    protected $appends = ['content'];
    public function pretext(){
       return $this->belongsTo('App\Models\Text', 'pretext_id');
    }

   public function getContentAttribute(){
      $pretext = $this->pretext()->get();
      if ($pretext->count()) {
        return $pretext;
      }
     return $this;
   }
}

然后在控制器或视图中,如果你有实例 (如果您有 N+1 个问题,请考虑优化它)

$obj = Text::find(1);
dd($obj->content);

我想你可以创建另一个调用 pretext() 的方法并检查返回值。

public function getPretext() {
    $value = pretext();
    return ($value)? $value : $this; 
}