laravel ORM的addSelect添加的字段,如何加入条件筛选

如标题…

Thing::addSelect([
    'total_cell_number'=>Cell::whereColumn('thing_id','things.id')
        ->selectRaw('SUM(cell_number)')
])->withCasts([
    'total_cell_number'=>'int'
])->get();

像这样拼接上去的 ‘total_cell_number’如何用条件筛选
比如和0作比较?
如何和数据库字段作列比较?
试了whereRaw、where均无效

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
最佳答案

首先说明下SQL语句,打印一下SQL语句,会发现total_cell_number是通过子查询在数据库中临时拼接的一个新字段,这个新字段并不在数据表中,所以不能使用WHERE关键字,你需要使用HAVING关键字(这个是mysql的知识体系)。

SELECT 
    `things`.*, 
    (
        SELECT SUM(cell_number) FROM `cells` 
        WHERE `thing_id` = `things.id`
    ) AS `total_cell_number ` 
FROM `things` 
HAVING `total_cell_number ` > 0

知道这个知识点后,就好办了,LaravelIlluminate\Database\Query\Builder提供了having方法:

Thing::addSelect([
    'total_cell_number' => Cell::whereColumn('thing_id','things.id')->selectRaw('SUM(cell_number)'),
])
->withCasts([
    'total_cell_number' => 'int'
])
->having('total_cell_number', '>', 0)
->get();

补充个链接吧:正确理解MySQL中的where和having的区别

3年前 评论
KaKa_Tao (楼主) 3年前
讨论数量: 3

首先说明下SQL语句,打印一下SQL语句,会发现total_cell_number是通过子查询在数据库中临时拼接的一个新字段,这个新字段并不在数据表中,所以不能使用WHERE关键字,你需要使用HAVING关键字(这个是mysql的知识体系)。

SELECT 
    `things`.*, 
    (
        SELECT SUM(cell_number) FROM `cells` 
        WHERE `thing_id` = `things.id`
    ) AS `total_cell_number ` 
FROM `things` 
HAVING `total_cell_number ` > 0

知道这个知识点后,就好办了,LaravelIlluminate\Database\Query\Builder提供了having方法:

Thing::addSelect([
    'total_cell_number' => Cell::whereColumn('thing_id','things.id')->selectRaw('SUM(cell_number)'),
])
->withCasts([
    'total_cell_number' => 'int'
])
->having('total_cell_number', '>', 0)
->get();

补充个链接吧:正确理解MySQL中的where和having的区别

3年前 评论
KaKa_Tao (楼主) 3年前

在问个问题 拼接的字段该如何与数据库中的字段作比较

3年前 评论
LiamHao 3年前

@KaKa_Tao 如果想用这个拼接的字段与数据库中的字段做比较,要使用havingRaw,这就要分情况了,假设被比较的字段名为brand

  • brand字段存在things表中,则直接写字段名就行:
Thing::addSelect([
    'total_cell_number' => Cell::whereColumn('thing_id','things.id')->selectRaw('SUM(cell_number)'),
])
->withCasts([
    'total_cell_number' => 'int'
])
->havingRaw('total_cell_number > brand')
->get();
  • brand字段不存在things表中,而是在另一个products表里,那就需要先JOIN这个表,然后再对比:
Thing::addSelect([
    'total_cell_number' => Cell::whereColumn('thing_id','things.id')->selectRaw('SUM(cell_number)'),
])
->leftJoin('products', 'products.id', '=', 'things.product_id')
->withCasts([
    'total_cell_number' => 'int'
])
->havingRaw('total_cell_number > brand')
->get();

注意使用join()方法时,如果两个表中有相同的字段,则Eloquent返回的结果取值是被 join 的表的字段值。例如id字段,返回的结果集将是products表的id值。

建议你尽可能自己多翻翻书,查查资料。

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!