Превратите более сложный запрос SQL в красноречивый запрос (модели) - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь преобразовать свое приложение PHP / JS в проект laravel, однако я новичок в Laravel и отношениях Eloquent.

Пока что я создал Модель User со следующими функциями, описывающими отношения db как красноречивые отношения:

public function configs() {
    return $this->hasMany('App\Configuration', 'user_id');
}

public function rooms() {
    return $this->hasManyThrough('App\Room','App\Configuration','user_id','config_id','id','id');
}

И модель Room со связями:

public function configs() {
    return $this->hasMany('App\Configuration', 'config_id');
}

public function user() {
    return $this->hasOneThrough('App\Configuration', 'App\User', 'user_id','config_id','id','id');
}

Configuration.php - это еще не заполнен какими-либо красноречивыми отношениями.

На мой вопрос: я хочу получить все комнаты с их config_id для запрашивающего пользователя. Это мой SQL запрос:

SELECT *
FROM rooms
INNER JOIN configurations ON rooms.config_id = configurations.id
INNER JOIN users ON  configurations.user_id = users.id
WHERE user_id = 4
ORDER BY config_id

У меня также есть красная документация, но мне все равно не придет в голову, если мне придется сделать более «сложный» запрос, подобный приведенному выше.

Мои попытки выглядят так:

$user_id = Auth::user()->id;
$projects = Room::with('Confuguration')
->whereHas('configs', function($q) use ($user_id){
      $q->where('config_id', 'like', $user_id);
})->get();

return view('home', compact('projects'));

1 Ответ

0 голосов
/ 18 июня 2020

вы хотите, чтобы все config_ids с комнатами, добавленными к ним для текущего пользователя.

модель комнаты уже имеет имя столбца 'config_id', поэтому нет необходимости в информации таблицы настроек ...

в модели Room у нас есть отношение под названием «пользователь» (должны быть пользователи с буквой «s»), мы можем использовать его в сочетании с whereHas

$projects = Room::whereHas('user', function($q) use ($user_id){
      $q->where('id', '=', $user_id);
})->get();

как я уже сказал, теперь проект будет быть комнатами для пользователя, включая 'config_id', поэтому нет необходимости загружать отношение 'configs'

...