2

我在 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 类型的对象”的错误。

我也不能实例化 anew 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');
}
4

2 回答 2

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();
于 2017-10-30T09:28:54.420 回答
-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, 
    }
}

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

于 2016-09-21T14:47:58.783 回答