3 回答
TA贡献1780条经验 获得超4个赞
在我看来,如果您要重用它,请创建一个服务来执行该查询并返回结果,如下所示SearchService:
<?php
class SearchService
{
public static function perform(array $params){
$sql = "SELECT distinct product_name,product_offer.quantity, product_offer.price
FROM product
inner join brand on product.brand_id = brand.brand_id
inner join brand_area on brand_area.brand_id = brand.brand_id
inner join area on area.area_id = brand_area.area_id
inner join product_offer on product_offer.product_id = product.product_id
where area.area_id = :area
and product.size_id = :size ";
return DB::select( DB::raw($sql), $params);
}
}
?>
通过这样做,你可以打电话
SearchService::perform([...]);
得到结果。
显然这是 version1.0,你可以通过很多方式改进它,例如让它不是静态的以使其可测试,还允许 getter 和 setter 存在,还有很多其他的东西,可能是有用的
TA贡献1806条经验 获得超8个赞
你有一个公平的观点,说在控制器中放置查询看起来不正确。
此外,我认为您可以使用 LaravelDB
进行此类查询,而无需将其编写为原始查询。我认为这里没有必要进行原始查询。Laravel DB
table()
、select()
和where()
其他方法应该足够了。
实际上,您可以使用模型及其关系来编写此代码,但如果查询速度很慢,最好使用查询构建器来提高效率。
编辑:
对于一些不属于任何我记得看到使用过的自定义特征的特定查询,也可能是一个解决方案。
TA贡献1906条经验 获得超3个赞
我正在写我之前的评论作为答案,因为我认为它确实是您正在寻找的东西:
我建议你使用一个 Trait 来做到这一点。原因是它会让您的代码保持干净,并且您以后可以重用此代码用于其他用途。Trait 是为可重用代码而创建的。
您将创建一个特征:
<?php
namespace App\Traits; // Optional, but you could create a namespace for all your Traits if you need others
trait MyCustomTrait
{
public function perform(array $params) {
$sql = "SELECT distinct product_name,product_offer.quantity, product_offer.price
FROM product
inner join brand on product.brand_id = brand.brand_id
inner join brand_area on brand_area.brand_id = brand.brand_id
inner join area on area.area_id = brand_area.area_id
inner join product_offer on product_offer.product_id = product.product_id
where area.area_id = :area
and product.size_id = :size ";
return DB::select( DB::raw($sql), $params);
}
}
use MyCustomTrait要使用它,只需在您的控制器范围内编写:并像这样调用您的函数: $this->perform([...])。
- 3 回答
- 0 关注
- 137 浏览
添加回答
举报