我在Illuminate中有一个对象,它具有一个可以根据主对象的属性返回不同对象的关系
public function relation(){
switch($this->type){
case "type_1":
return $this->belongsTo('\Models\Type1', 'idElement');
break;
case "type_2":
return $this->belongsTo('\Models\Type2', 'idElement');
break;
default:
return null;
}
}
这会产生错误"关系方法必须返回类型为Illuminate \ Database \ Eloquent \ Relations \ Relation"的对象。当"默认"部分被执行。
此外,我无法实例化new Illuminate\Database\Eloquent\Relations\Relation()
,因为它是一个抽象类。
我可以创建一个空表并返回一个空表的关系,它总是返回一个空值,但这不是一个解决方案。
如何在默认选项中返回空关系?
更新:
我已将其更改为使用多态关系,但现在的问题是:如何将多态关系设置为可选关系?
Relation::morphMap([
'type_1' => \App\Models\Type1::class,
'type_2' => \App\Models\Type2::class
]);
....
public function relation(){
return $this->morphTo(null, 'type', 'idElement');
}
答案 0 :(得分:0)
我建议创建一个存根关系类,并在需要返回空(或固定)集合时使用它。
<?php
namespace App;
use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Database\Eloquent\Collection;
/**
* Stub relationship
*/
class EmptyRelation extends Relation
{
public function __construct() {}
public function addConstraints() {}
public function addEagerConstraints(array $models) {}
public function initRelation(array $models, $relation) {}
public function match(array $models, Collection $results, $relation)
{
return $models;
}
public function getResults()
{
return new Collection();
}
}
然后在默认部分中执行以下操作:
return new \App\EmptyRelation();
答案 1 :(得分:-1)
嗯..这可能不是最好的选择但是有效。
public function relation(){
switch($this->type){
case "type_1":
return $this->belongsTo('\Models\Type1', 'idType1');
break;
case "type_2":
return $this->belongsTo('\Models\Type2', 'idType2');
break;
default:
return $this->hasOne('\Models\ThisModel', 'id','id')->where('id','<',0 );//Assuming you have an id autoincrement field that starts in 1 in your table,
}
}
这将返回一个空集合,我不确定这是否是您正在寻找的