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的更多内容: