Illuminate Eloquent返回返回不同对象的关系的null关系

时间:2016-09-21 14:17:16

标签: laravel eloquent illuminate-container

我在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');
}

2 个答案:

答案 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, 
    }
}

这将返回一个空集合,我不确定这是否是您正在寻找的