亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我應該在 Laravel 的什么地方放置復雜的查詢?

我應該在 Laravel 的什么地方放置復雜的查詢?

PHP
鳳凰求蠱 2023-05-12 14:45:56
所以我在互聯網上搜索了類似的案例,但我只是從所有相互矛盾的答案和不相關的場景中迷失了方向。所以我想提出我的案例,希望得到一些具體的答案。我是 Laravel 的新手,正在創建小型應用程序。在應用程序中,我必須搜索要約并在刀片視圖中顯示結果。由于查詢很復雜,并且搜索的輸出不屬于特定模型,我只想將其保留為原始查詢。我已將查詢放在控制器中,但我覺得它不是正確的地方。特別是如果我需要在很多地方重用查詢。這是來自 OfferController 的方法:public function search(Request $request){    $area =  $request->area;    $size =  $request->size;    $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 ";    $params = array(        'area'=>$area,        'size'=>$size    );    $offers = DB::select( DB::raw($sql), $params);    return view('searchresult')->with($offers);}簡而言之:我應該將查詢移至模型,創建 DAL 類,還是將其保留在這里?請記住,該項目規模較小。
查看完整描述

3 回答

?
Helenr

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 存在,還有很多其他的東西,可能是有用的



查看完整回答
反對 回復 2023-05-12
?
慕森卡

TA貢獻1806條經驗 獲得超8個贊

你有一個公平的觀點,說在控制器中放置查詢看起來不正確。

此外,我認為您可以使用 LaravelDB進行此類查詢,而無需將其編寫為原始查詢。我認為這里沒有必要進行原始查詢。Laravel?DB?table()、select()where()其他方法應該足夠了。

實際上,您可以使用模型及其關系來編寫此代碼,但如果查詢速度很慢,最好使用查詢構建器來提高效率。

編輯:

對于一些不屬于任何我記得看到使用過的自定義特征的特定查詢,也可能是一個解決方案。


查看完整回答
反對 回復 2023-05-12
?
一只名叫tom的貓

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([...])。


查看完整回答
反對 回復 2023-05-12
  • 3 回答
  • 0 關注
  • 167 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號