Laravel 5.7-通过morphMany关系和自定义属性getter进行热切加载

时间:2019-02-15 18:31:48

标签: php laravel eager-loading

所以我有以下模型:

class TemplateEntity extends Model {
    protected $table = "TemplateEntities";

    const UPDATED_AT = null;
    const CREATED_AT = null;

    public function element() {
        return $this->morphTo("element", "entity_type", "id_Entity");
    }

    public function getEntityTypeAttribute($entity_type) {
        return 'App\\' . $entity_type;
    }
}

class Template extends Model {
    protected $table = "Template";

    const UPDATED_AT = null;
    const CREATED_AT = null;

    public function entities() {
        return $this->hasMany("App\TemplateEntity", "id_Template");
    }
}

class TemplateEntity extends Model {
    protected $table = "TemplateEntities";

    const UPDATED_AT = null;
    const CREATED_AT = null;

    public function element() {
        return $this->morphTo("element", "entity_type", "id_Entity");
    }

    public function getEntityTypeAttribute($entity_type) {
        return 'App\\' . $entity_type;
    }
}

我想使用雄辩的ORM的:: with()方法来加载模板实体元素,但是每当执行此操作时,我都会得到一个错误:

//$template_id is defined as a controller param
$template = Template::with("entities", "entities.element")->where("id", "=", $template_id)->get()

"Class 'App\' not found"

我做了一些调试,当我在TemplateEntity的GetEntityTypeAttribute()方法中回显$ entity_type时,我得到一个空值。但是,如果我不使用紧急加载,我的模型通常可以正常工作,但是如果可能的话,我希望将其添加到应用程序中以提高效率。

所有人都能提供的任何帮助都会有所帮助!

edit:修正了一个错字,应该是Template :: with而不是$ template :: with

1 个答案:

答案 0 :(得分:1)

部分问题可能是该变量中的空白类。建议您在调用get()时使用类名。因此,\App\Template::而非$template::

另一个可以帮助您解决关系负担的方法可能是您。也许尝试通过该函数进行调用。这可能对您更好:

 \App\Template::with(['entities' => function($query){
        $query->with('element');
    }])->get();

访问器功能可能会干扰Laravel变形功能。我意识到您想在数据库中使用该类的简称。要在不使用getter的情况下(并且全局地)执行此操作,建议使用morphMap。

boot()方法内的 AppServiceProvider 中:

  \Illuminate\Database\Eloquent\Relations\Relation::morphMap([
        'MyTemplate' => \App\MyTemplate::class,  
        'Section' => \App\Section::class,  
         // etc.        
    ]);

这将允许您仅向数据库添加“ Section”,并从类中删除访问器函数。