自定义 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 部分执行时。所以我的问题是:
- 如何将 $this 转换为 Relation 类型的对象?或者:
- 我怎样才能以不同的方式实现我的目标?
试试动态道具
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;
}
我有一个模型 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 部分执行时。所以我的问题是:
- 如何将 $this 转换为 Relation 类型的对象?或者:
- 我怎样才能以不同的方式实现我的目标?
试试动态道具
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;
}