Php Laravel 5.7-使用morphMany关系和自定义属性getter的急切加载

Php Laravel 5.7-使用morphMany关系和自定义属性getter的急切加载,php,laravel,eager-loading,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_Enti

因此,我有以下模型:

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时,得到一个空值。然而,如果我不使用即时加载,我的模型通常工作得很好,但是如果可能的话,我想将其添加到我的应用程序中,以提高效率

你们能提供的任何帮助都会有所帮助


编辑:修复了一个输入错误,应该是Template::with而不是$Template::with

问题的一部分可能是该变量中的空白类。建议您在调用
get()
时使用类名。所以
\App\Template::
而不是
$Template::

另一个需要帮助的项目可能是你调用关系的渴望负载的方式。也许尝试通过函数调用。这可能对您更有效:

 \App\Template::with(['entities' => function($query){
        $query->with('element');
    }])->get();
访问器函数可能会干扰Laravel变形函数。我意识到您想在DB中使用类的简称。要在不使用getter(全局)的情况下实现这一点,我建议使用morphMap

boot()方法中的AppServiceProvider中:

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

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

呃,我的错,这是我的错误。即使使用了\App\Template::with,我仍然会得到一个错误。如果您像我上面写的那样尝试查询,是否仍然会得到完全相同的错误?IE名称空间是否正确,内部函数是否会产生影响?不,仍然会出现相同的错误。我想这可能是laravel的getAttribute()方法的一个bug,老实说,是的,我以前从未见过Morpto类型的getter。这是由Laravel在内部处理的,可能与响应的时间安排有冲突。我通常将类型视为类上的一个变量,存储在变形ID旁边的db中。如果它不在db中,这可能会与查找类的调用冲突,似乎就是这样。是否可以将实体类型添加到类/db并删除getter?要添加\App。。。如果您愿意,可以使用变形贴图实体类型存储在数据库中,但仅作为“节”或“节组”存储。缺少获取正确型号所需的“应用程序”。如何使用变形贴图?