自定义Eloquent关系有时返回$ this Model

时间:2017-07-23 16:50:30

标签: laravel eloquent relation

我有一个名为Text的1对多关系的模型pretext(),将1对多关系商店返回到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()将返回$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方法必须返回一个类型为Illuminate \ Database \ Eloquent \ Relations \ Relation

的对象

执行else-part时。所以我的问题是:

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

2 个答案:

答案 0 :(得分:1)

尝试动态道具

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);

答案 1 :(得分:0)

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

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