将原始sql查询转换为laravel eloquent

qgzx9mmu  于 2021-06-18  发布在  Mysql
关注(0)|答案(8)|浏览(342)

我的项目是一个内容管理系统&它的新版本将集成在一个laravel框架中;还有很多庞大的sql查询需要转换成雄辩的语法。
我发现下面的工具可以将我已经编写的查询转换成有说服力的语法,但它不起作用。
谁能指导我转换我的查询或帮助我找到一个工具,可以做这项工作?
请在下面找到我的查询示例(请注意,我的大多数查询看起来都很相似):

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

谢谢您。

b1uwtaje

b1uwtaje1#

您应该在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();
zsohkypk

zsohkypk2#

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

tpxzln5u3#

实际上,您的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;

你可以在这里阅读更多关于左连接的内容。
同样,像这样匹配id也不是明智之举,最好在productpictures和productprices上有一个product\u id,然后在products表上有一个外键约束。
但这不是问题所在。为了使这成为拉拉威尔雄辩你应该使用关系,然后你可以简单地做这样的事情:

$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;
cgvd09ve

cgvd09ve4#

请使用此联机工具将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();
k2fxgqgv

k2fxgqgv5#

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查询

nkhmeac6

nkhmeac66#

为什么要这样做

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字符串。但我认为这不是最好的办法!

aemubtdh

aemubtdh7#

我在网上找到了这个工具。它可以帮助寻找工具的人更快地完成工作。它可能不总是正确的。

2skhul33

2skhul338#

用这个

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();

相关问题