Странное поведение красноречивых отношений один на один - PullRequest
0 голосов
/ 06 декабря 2018

Мне нужно получить пользователя с соответствующим профилем, но в случае, если поле профиля ниже нуля:

Route::get('/user', function (Request $request) {
  return $request->user()->load('profile'); // { id: 1, ... profile: null }
});

Но в этом случае поле профиля заполнено:

Route::get('/user', function (Request $request) {
    $user = $request->user();
    $profile = $user->profile;
    return $user; // { id: 1, ... profile: { name: 'alex', ... } }
});

Как вы можете объяснить это поведение и как правильно загрузить Профиль в моем случае?

Отношения:

public function user(){
    return $this->belongsTo('App\Models\User');
}

public function profile(){   
    return $this->role == 'model' ? $this->hasOne('App\Models\Model\Profile') : $this->hasOne('App\Models\Client\Profile');
}

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Пройдите через это для ясного представления Стремительная загрузка

Таким образом, чтобы получить отношение с помощью with (), он будет запускать оба запроса одновременно и иметь отношение, привязанное к коллекции моделей, но покасначала с помощью load () мы получаем модель, а затем при некоторых условиях используем load для получения реляционных данных.Например:

      $users = User::all();   //runs first query

      if($condition) {
      $users = $users->load('organisations');  //lets assume organisations is relation here.
       //here runs the 2nd query
       }

Надеюсь, это поможет.

0 голосов
/ 06 декабря 2018

load () - это Lazy Eager Загрузка

Используя load (), вам нужно сначала выполнить первоначальный запрос, а затем выполнить загрузку отношения в какой-то более поздний момент.Это "Ленивая" нетерпеливая загрузка.Ленивый нетерпеливый загрузить отношения после того, как родительская модель уже была извлечена.

laravel с методом () против метода load ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...