Проблема с использованием быстрой загрузки в модели Eloquent

#laravel-5 #eloquent #eager-loading #laravel-5.7 #eloquent-relationship

#laravel-5 #eloquent #быстрая загрузка #laravel-5.7 #eloquent-взаимосвязь

Вопрос:

У меня есть 2 модели и их отношения. Первый класс называется ‘Documento’:

 class Documento extends Model
{
    protected $table = 'documento';
    protected $primaryKey = 'cod_documento';

    public function emisor()
    {
        return $this->belongsTo('AppEmisor', 'cod_emisor', 'cod_emisor');
    }
}
  

Вторая называется «Emisor»:

 class Emisor extends Model
{
    protected $table = 'emisor';
    protected $primaryKey = 'cod_emisor';

    public function documentos()
    {
        return $this->hasMany('AppDocumento', 'cod_emisor', 'cod_emisor');
    }
}
  

Отношения моделей один ко многим (у одного отправителя много документов, а у одного документа только один отправитель).

В Thinker я пытаюсь получить отправитель из документа, и это хорошо работает:

 >>> Documento::find(1)->emisor->name
=> "Emisor Name"
  

Но когда я пытаюсь выполнить быструю загрузку отправителя в document, это «завершается неудачей»:

 >>> Documento::find(1)->with('emisor')->count();
=> 94041
  

Я ожидал одного результата, но запрос возвращает 94041 документ.

Почему это происходит? Как получить один документ с вложенным редактором?

Ответ №1:

Поменять find() и with() :

 $documento = Documento::with('emisor')->find(1);
  

Или используйте отложенную ускоренную загрузку:

 $documento = Documento::find(1)->load('emisor');
  

С существующим экземпляром модели:

 $documento->load('emisor');
  

Вы получаете этот неожиданный результат, потому что Documento::find(1)->with('emisor') создается новый запрос, который запрашивает все Documento записи. Отсюда общее количество 94041 .

Комментарии:

1. Но если я использую ваше первое решение в show методе в контроллере (используя привязку модели), всегда возвращайте первый документ: общедоступная функция show(Documento $documento) { return $documento->with(’emisor’)->find(1); } «

2. Используйте второй вариант для экземпляров модели: $documento->load('emisor');