2016-12-15 3 views
0

У меня проблема с таблицей запроса laravel.Laravel query on relation table

У меня есть отношение: у каждого пользователя есть вложение, а приложение принадлежит пользователю. Я писал отношение в модели.

Мой вопрос: как сделать запрос, если я хочу вернуть пользователя с привязкой отношения, но для вложения, где level = user level? Даже если я делаю whereHas, это возвращает мне все приложения для пользователя. Пожалуйста помоги!

ответ

0

При запросе модели отношений вы написать что-то вроде

$attachments = $userModel->attachments; 

который является аббревиатурой для

$attachments = $userModel->attachments()->get(); 

так что вы можете написать

$attachments = $userModel->attachments()->where('level', 'user')->get(); 
+0

ОК, но в этой ситуации я должен сначала получить пользователя. Я хочу сделать один запрос примерно так: Profile :: with ('attachment'). Я хочу получить объект Профиль со связанными данными, но не со всеми связанными данными, но где level = user_level –

1

Если вы хотите найти пользователя WHOS вложения удовлетворяют определенным ограничениям, затем используют метод whereHas

UserModel::whereHas('attachments', function ($attachmentQuery) { 
    $attachmentQuery->where('level', 'profile_level'); 
})->get(); 

Если вы хотите от уже запрошены модели получить конкретные вложения затем написать

$userModel->attachments()->where('level', 'profile_level')->get(); 

невозможно запросить как UserModel и AttachementModel в одном запросе, он должен быть по крайней мере два запроса. Даже причудливый UserModel::with('attachments')->get();, который возвращает пользователя со всеми вложениями, выполняет внутренне два запроса.

Edit:

Я заметил, что вы можете определить relation constraints в with метод

UserModel::with(['attachments' => function ($attachmentQuery) { 
    $attachmentQuery->where('level', 'profile_level'); 
}])->get(); 

Так что, если вы хотите найти пользователя WHOS вложения встретились определенные ограничения и нетерпеливый нагрузки, что вложения, то вы можете сделать

$queryAttachments = function ($attachmentQuery) { 
    $attachmentQuery->where('level', 'profile_level'); 
}; 

UserModel::whereHas('attachments', $queryAttachments) 
->with(['attachments' => $queryAttachments])->get(); 
+0

Да, это правда, но я хочу вернуть пользователя с вложениями, но не со всеми вложениями, а с вложениями, где level = profile_level. Надеюсь, теперь ясно. –

+0

Я отредактировал свой ответ. –

+0

OK почти там. Но теперь у меня есть объект с вложением только без информации пользователя :(Я не знаю, есть ли возможность сделать это из бэкэнд? Если нет, я просто возвращаю пользователя со всем его вложением, а затем в fron-end получаю определенные вложения. –

0

Вы можете попробовать: сочетание whereHas и with методов as:

Profile::whereHas('attachments', function ($q) { 
     $q->where('level', 'user'); 
    }) 
    ->with(['attachments', function ($q) { 
     $q->where('level', 'user'); 
    }]) 
    ->get();