Php 一对多雄辩关系:基于相关表进行过滤的查询';s列值

Php 一对多雄辩关系:基于相关表进行过滤的查询';s列值,php,mysql,laravel,eloquent,Php,Mysql,Laravel,Eloquent,我有两张像这样的桌子: 股票: id | name | market_cap 1 | Microsoft | 5000 2 | Tesla | 2000 此表与名为“股票评级”的表有一对多关系: id | stock_id | measure | value 12 | 1 | revenue | 30 13 | 1 | dividend| 5 14 | 2 | revenue | 10 15 | 2 | divide

我有两张像这样的桌子:

股票

id | name      | market_cap
1  | Microsoft | 5000
2  | Tesla     | 2000
此表与名为“股票评级”的表有一对多关系:

id | stock_id | measure | value
12 | 1        | revenue | 30
13 | 1        | dividend| 5
14 | 2        | revenue | 10
15 | 2        | dividend| 0
现在,让我们假设一个用户想要获得所有
市值>3000
的股票,跳过前20个结果,然后获得下20个结果。这项工作:

$query = Stock::where('market_cap', '>', 3000);
$stocks = $query->skip(20)->take(20)->get();
但是,用户还需要能够查询股票评级。因此,我们假设,除了上述条件,他还想为
收入
度量找到所有
值>20
的股票

我试过这个,但不起作用。它返回与没有此附加条件时相同的股票列表

$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();
这将返回所有
市值>3000
的股票,而不考虑
股票评级表中的
值和
度量值。它返回
stock\u ratings
值为负值的股票,其中
measure=revenue
,还返回在stock\u ratings中没有相关行的行


如何解决此问题?

当您在
中使用
应用约束时,这意味着该约束适用于哪些嵌套相关记录应立即加载,哪些不应立即加载

但是,在您的情况下,您希望根据相关评级中包含的值对股票进行过滤或应用约束

所以试试这个

$query=Stock::where('market_cap','>',3000);
$query=$query->whereHas('ratings',function($q){
$q->where('measure','revenue');
$q->where('value','>',0);
})-带有(“评级”);
$stocks=$query->skip(20)->take(20)->get();
请阅读Laravel docs的更多内容: