将原始SQL查询转换为Laravel雄辩

时间:2018-10-31 08:59:30

标签: php mysql sql laravel eloquent

我的项目是一个内容管理系统,它的新版本将集成在Laravel框架中;而且有很多巨大的SQL查询需要转换为雄辩的语法。

我找到了以下tool来将我已经写好的查询转换为雄辩的语法,但这是行不通的。

有人可以指导我转换查询或帮助我找到可以胜任的工具吗?

请在下面找到我的查询示例(请注意,我的大多数查询看起来都很相似):

SELECT id, name, code,
       ( SELECT price FROM productprice WHERE id = p.id ) AS price,
       ( SELECT image FROM productpictures WHERE id = p.id LIMIT 1 ) 
AS image
FROM product p 
WHERE categoryid = 1

谢谢。

10 个答案:

答案 0 :(得分:1)

请使用此online tool将SQL查询转换为Laravel Builder。

转换后的查询应显示在Laravel Builder中:

DB::select(`id`,`name`,`code`)
    ->selectSub(`SELECT price FROM productprice WHERE id = p.id`, `price`)
    ->selectSub(`SELECT image FROM productpictures WHERE id = p.id LIMIT 1`, `image`)
    ->from(`product as p`)
    ->where(`categoryid`, `=`, 1)
    ->get();

答案 1 :(得分:1)

我只是为此制作了一个工具。您可以免费使用here

答案 2 :(得分:0)

我认为

This是最好的工具:)阅读和了解文档,因为没有一种工具能够针对每种情况自动完成。

这是我对您上面的查询的尝试:

DB::table('product as p')
   ->select([
       'id',
       'name',
       'code',
       'pp.price',
       'ppic.image'
   ])
   ->join('productprice as pp', 'pp.id', '=', 'p.id')
   ->join('productpictures as ppic', 'ppic.id', '=', 'p.id')
   ->where('categoryid', 1)
   ->get();

答案 3 :(得分:0)

使用此

DB::table('product')
    ->select('id','name','code','productprice.price','productpictures.image')
    ->join('productprice','productprice.id' = 'product.id')
    ->join('image','productpictures.id' = 'product.id')
    ->where('product.categoryid',1);
    ->get();

答案 4 :(得分:0)

请尝试这种方式

  Model::select(
    'id', 
    'name', 
    'code', 
     DB::raw('( SELECT price FROM productprice WHERE id = p.id ) AS price,'),
     DB::raw('( SELECT image FROM productpictures WHERE id = p.id LIMIT 1 ) AS image')
    )   ->where('categoryid', 1);

此代码通过示例创建了相同的SQL字符串。 但是我认为这不是最好的方法!

答案 5 :(得分:0)

您的SQL确实应该像这样使用联接:

SELECT 
p.id,
p.name,
p.code,
pprice.price,
ppictures.image
FROM product p
LEFT JOIN productprice pprice on p.id = pprice.id
LEFT JOIN productpictures ppictures on p.id = ppictures.id
WHERE p.categoryid = 1;

您可以阅读关于here的更多有关左联接的信息。

也许也不建议像这样匹配ID,最好在productpictures和productprices上有一个product_id,然后可以在product表上对此设置外键约束。

但是,这不是问题。要将其变为雄辩的,您应该使用relationships,然后可以简单地执行以下操作:

$Product = Product::select('id', 'name', 'code')
->with('ProductPrice', 'ProductPictures')
->where('categoryid', 1)
->get();

您将能够像这样将其拉出:

$Product->id;
$Product->name;
$Product->code;
$Product->ProductPrice->price;
$Product->ProductPicture->image;

答案 6 :(得分:0)

您应该在where子句中提及表别名或表名,否则将给出完整性违背约束。

 DB::table('product as p')
                ->join('productprice', 'product.id', '=', 'productprice.id')
                ->join('productpictures','currencies.id','=','product.id ')
                ->select('p.id' ,'p.name' , 'p.code' , 'productprice.price', 
                  'productpictures.image as image')
                ->where('p.categoryid',1)
                ->get();

答案 7 :(得分:0)

Update accesos set salida="2019-05-05 12:00:00" where salida = "0000-00-00 00:00:00" 

答案 8 :(得分:0)

我找到了这个Online Tool。它可以帮助寻找该工具的人更快地完成工作。它可能并非始终都正确。

答案 9 :(得分:-3)

SELECT *
FROM tbl_users as tu
WHERE
    tu.rank!='Admin' AND
    #where there is space (less than 2 children)
    (SELECT COUNT(*)
        FROM tbl_users
        WHERE under_of=tu.username) < 2
ORDER BY
    #distance from top of tree
    tu.id,
    #by free space
    (SELECT COUNT(*)
        FROM tbl_users
        WHERE under_of=tu.username),
    #leftmost
    tu.id

将SQL查询转换为Laravel查询