У меня этот код работает правильно $sector = Sector::where('ref_id', $sectorId)->with('offers.provider')->first();
который был изменен на код ниже для большей гибкости и лучшего понимания того, что я хочу сделать:
$sector = Sector::where('ref_id', '$sectorId')
->with(
[
'offers' => function($query) {
$query->with(
[
'provider' => function($query) {
$query->select('name');
}
]
);
}
]
)
->first();
Итак, здесь мы берем sector
, offers
ссылка на это sector
и под каждым offer
мы берем связанный provider
, Сейчас, providers
имеют status
который либо 0
или же 1
, Итак, основываясь на моем коде выше, есть ли способ получить ТОЛЬКО offers
которые имеют providers
со статусом 1
?
Пожалуйста, помогите мне решить эту проблему.
Ты можешь использовать whereHas — который специально предназначен для работы в подобных сценариях. Пример из документации:
Если вам требуется еще больше возможностей, вы можете использовать методы whereHas и orWhereHas для установки условий «где» в ваших запросах has. Эти методы позволяют добавлять настраиваемые ограничения в ограничение отношений, например, проверять содержимое комментария:
// Retrieve all posts with at least one comment containing words like foo%
$posts = Post::whereHas('comments', function ($query) {
$query->where('content', 'like', 'foo%');
})->get();
Не позволяйте фрагменту обмануть вас, он будет отлично работать внутри closure
как у вас выше.
Вы пытались добавить предложение where в запросе провайдера, чтобы выбрать только провайдеров со статусом 1?
'provider' => function($query) {
$query->select('name')->where('status', 1);
}
РЕДАКТИРОВАТЬ: Я не эксперт в Laravel, но, возможно, пример запроса, с которым у меня возникли проблемы, может пролить свет на вашу проблему:
$dealer = $this->dealer->where('foreign_dealer_id', $dealerIdInFeed)
->where(function ($subQuery) use ($accountTypes) {
if(count($accountTypes) > 1)
{
foreach($accountTypes as $accountType)
{
$subQuery->orWhere('account_type', $accountType);
}
}
else
{
$subQuery->orWhere('account_type', $accountTypes);
}
})
->first();