Laravel 5.7 - Стремительная загрузка с помощью отношений morphMany и получения пользовательских атрибутов - PullRequest
0 голосов
/ 15 февраля 2019

Итак, у меня есть следующие модели:

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;
    }
}

Я хочу загрузить элементы сущности шаблона с помощью метода Eloquent 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"

Я сделал некоторую отладку, и когда я повторяю $ entity_type в методе GetEntityTypeAttribute () TemplateEntity, я получаю пустое значение.Тем не менее, мои модели в целом работают нормально, если я не использую энергичную загрузку, но я хотел бы добавить ее в свое приложение, если это возможно, чтобы сделать его более эффективным.

Любая помощь, которую вы можете предоставить всем, поможет!

edit: исправлена ​​опечатка, должен был быть Template :: with вместо $ template :: with

1 Ответ

0 голосов
/ 15 февраля 2019

Часть проблемы может быть пустым классом в этой переменной.Предлагаем вам использовать имя класса при звонке get().Так что \App\Template:: вместо $template::.

Другим предметом, который может помочь, может быть то, как вы вызываете напряженную нагрузку отношений.Возможно, попытаться вызвать через функцию.Это может работать лучше для вас:

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

Функция доступа может мешать функции морфа Laravel.Я понимаю, что вы хотите использовать сокращенное имя класса в БД.Чтобы сделать это без использования геттера (и глобально), я предлагаю использовать morphMap.

В AppServiceProvider внутри boot() метода:

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

Это позволит вам добавить только «Раздел» в БД и удалить функцию доступа из вашегокласс.

...