#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');