У меня есть две таблицы, которые выглядят так:
stocks
:
id | name | market_cap
1 | Microsoft | 5000
2 | Tesla | 2000
Эта таблица имеет связь «один ко многим» с таблицей под названием stock_ratings
:
id | stock_id | measure | value
12 | 1 | revenue | 30
13 | 1 | dividend| 5
14 | 2 | revenue | 10
15 | 2 | dividend| 0
Теперь предположим, что пользователь хочет получить все акции с помощью market_cap > 3000
, пропустить первые 20 результатов и получить следующие 20. Это работает:
$query = Stock::where('market_cap', '>', 3000);
$stocks = $query->skip(20)->take(20)->get();
Однако пользователь также должен иметь возможность запрашивать данные stock_ratings. Итак, скажем, в дополнение к указанным выше условиям он хочет найти все акции, которые имеют value > 20
для меры revenue
.
Я пробовал это, и это не работает. Он возвращает тот же список акций, что и без этого дополнительного условия.
$query = Stock::where('market_cap', '>', 3000);
$query = $query->with(['ratings' => function ($q) {
$q->where('stock_ratings.measure', 'revenue');
$q->where('stock_ratings.value', '>', 0);
}]);
$stocks = $query->skip(20)->take(20)->get();
Это возвращает все акции с market_cap > 3000
независимо от value
и measure
в таблице stock_ratings
. Он возвращает акции, которые имеют отрицательное значение value
в stock_ratings
, где measure = revenue
, а также строки, которые вообще не имеют связанных строк в stock_ratings.
Как решить эту проблему?
Когда вы применяете ограничение в with
, это означает, что применяется ограничение, для которых вложенные связанные записи должны быть загружены, а какие нет.
Однако в вашем случае вы хотите отфильтровать или применить ограничение к акциям на основе значений, содержащихся в соответствующих рейтингах.
Так что попробуй это
$query = Stock::where('market_cap', '>', 3000);
$query = $query->whereHas('ratings', function ($q) {
$q->where('measure', 'revenue');
$q->where('value', '>', 0);
})-with('ratings');
$stocks = $query->skip(20)->take(20)->get();
Подробнее читайте в документации Laravel: https://laravel.com/docs/8.x/eloquent-relationships#querying-relationship-existence