Php 将原始SQL查询转换为Laravel Eloquent

Php 将原始SQL查询转换为Laravel Eloquent,php,mysql,sql,laravel,eloquent,Php,Mysql,Sql,Laravel,Eloquent,我的项目是一个内容管理系统&它的新版本将集成在一个Laravel框架中;还有很多庞大的SQL查询需要转换成雄辩的语法 我发现以下方法可以将我已经编写的查询转换为雄辩的语法,但它不起作用 有谁能指导我转换我的查询或帮助我找到一个可以完成这项工作的工具吗 请在下面找到我的查询示例注意,我的大多数查询看起来都很相似: SELECT id, name, code, ( SELECT price FROM productprice WHERE id = p.id ) AS price,

我的项目是一个内容管理系统&它的新版本将集成在一个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
谢谢。

用这个

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();
为什么这样试试

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

实际上,您的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_ID,然后在products表上有一个外键约束

但遗憾的是,这不是问题所在。要使其成为具有说服力的laravel,您应该使用,然后您可以简单地执行以下操作:

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

您应该在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();
我找到了这个。它可以帮助寻找工具的人更快地完成工作。它可能并不总是正确的

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

请使用此选项将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();

我只是为这个做了一个工具。您可以免费使用它

如果您想使用ORM,那么您需要创建扩展Illumb\Database\Eloquent\Model的模型并设置适当的关系。或者,您可以使用Illumb\Database\Elount\Builder使用流畅的界面或标准SQL语法。您将使用哪种方法?是否有在线工具用于转换大型查询?如前所述:laravel文档是最好的工具。林克:如果你不了解某件事,你就不能期望它发展得很好。对于任何了解MySQL的人来说,雄辩都很简单,在很多情况下更容易。我知道雄辩。我发布这个问题是为了不帮助解决这些问题。我要求我有很多大型sql查询,并且需要时间将它们转换成雄辩的语句。我问有没有办法更快地转换查询?有多大?我曾经做过可能有100行的语句。在某些情况下,使用雄辩的语言可能不是最好的。你需要做出决定。我非常怀疑你能找到一个转换器来处理任何比简单SQL字符串更复杂的事情,或者它可能会有很多错误,因为你可能会花更多的时间来修复它,而不仅仅是自己去做。请再次阅读问题。这没有回答问题。请重新阅读问题。这没有回答问题。请重新阅读问题。这并没有回答问题。你能解释一下发生了什么吗?OP是问是否有一个工具来转换查询。问题不是转换这个特定的查询。它不再工作了。。。那个“在线工具”不起作用不幸的是,这是个好主意,尽管它很接近:
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();