2017-01-30 57 views
0

我想知道如何在Laravel中創建一個名爲「type」的默認變量並將值設置爲「car」。在Laravel中爲選擇查詢添加一個新列,其值爲Laravel

這是到目前爲止我的代碼:

$items = DB::table('items')->orderBy('created_at', 'desc') 
          ->join('items_categories', 'items.item_category_id', '=', 'items_categories.category_id') 
          ->select( 
            'items.id as items___item_id', 
            'items.item_title as items___item_title', 
            'items_categories.id as items_categories___category_id', 
            'items_categories.title as items_categories___category_title', 
            ) 
          ->take(20); 

這工作不錯。但是,我需要爲此選擇的每個記錄獲取/添加自定義鍵和值,以便稍後在模板中使用它來進一步過濾。

因此,我需要添加一個名爲type的鍵值爲car,所以在print_r中我會看到type => car用於每條記錄,我可以在我的代碼中使用它。

如何做到這一點?

我可以把這somhow在選擇?

像:

->select( 
      'items.id as items___item_id', 
      'items.item_title as items___item_title', 
      'items_categories.id as items_categories___category_id', 
      'items_categories.title as items_categories___category_title', 
      //something like this? 
      'type' = 'car' 
     ) 

因爲現在我得到這樣的:

Array 
(
    [0] => stdClass Object 
     (
      [items___item_id] => 10 
      [items___item_user_id] => 2 
      [items___item_title] => A new blue truck 
      [items_categories___category_id] => 1 
      [items_categories___category_title] => Truck 
     ) 

    [1] => stdClass Object 
     (
      [items___item_id] => 11 
      [items___item_user_id] => 2 
      [items___item_title] => VW Tiguan 
      [items_categories___category_id] => 1 
      [items_categories___category_title] => SUV 
     ) 

,我想這一點:

Array 
(
    [0] => stdClass Object 
     (
      [items___item_id] => 10 
      [items___item_user_id] => 2 
      [items___item_title] => A new blue truck 
      [items_categories___category_id] => 1 
      [items_categories___category_title] => Truck 
      [type] => car 
     ) 

    [1] => stdClass Object 
     (
      [items___item_id] => 11 
      [items___item_user_id] => 2 
      [items___item_title] => VW Tiguan 
      [items_categories___category_id] => 1 
      [items_categories___category_title] => SUV 
      [type] => car 
     ) 

如果可能的話,不能在模型文件,但是在一次查詢期間,因爲只有一次我需要做此修改。

+0

任何人都知道該怎麼做? –

+0

你有沒有理由不使用雄辯? –

+0

您是否想根據類型進行選擇? 'car'? –

回答

0

您將需要爲您的物品表創建一個模型並以此方式進行查詢。通過使用雄辯,您可以通過將列名添加到$ appends屬性然後定義模型屬性來即時創建列。

php artisan make:model Item 

任何模型都會自動尋找一個表格,它是模型名稱的複數形式(Item可以查找'items')。在項目模型中,添加以下行

/** 
* Append custom columns to the model 
* 
* @var array 
*/ 
protected $appends = ['type']; 

/** 
* Define the type column to every Item object instance 
* 
* @return string 
*/ 
public function getTypeAttribute() 
{ 
    return 'car'; 
} 

現在更新您的查詢以使用模型而不是DB :: select。確保使用的模式,在您的控制器

use App\Item; 

.... 

$items = Item::orderBy('created_at', 'desc') 
         ->join('items_categories', 'items.item_category_id', '=', 'items_categories.category_id') 
         ->select( 
           'items.id as items___item_id', 
           'items.item_title as items___item_title', 
           'items_categories.id as items_categories___category_id', 
           'items_categories.title as items_categories___category_title', 
           ) 
         ->take(20)->get(); 

的頂部,你需要使用一個模型時,它返回一個集合與DB:選擇要添加的get()作爲最後一個方法。

+0

謝謝,沒有模型部分的任何機會實現這一點?我的意思是我有一個模型項目,但我只需要在一個案例中做這個特定的事情,所以,這將是一個矯枉過正。 –

+0

您提到的添加'type'='car'的行應該可以正常工作,但模型確實是最好的方法。你已經在使用Eloquent,只需用模型調用替換一個DB :: select即可。沒有什麼是矯枉過正的,如果它的工作和乾淨! –

+0

嗯,如果我嘗試''type'='car''我得到'語法錯誤,意外的'='',如果我嘗試''type = car''我得到'Column not found:1054 Unknown column' type = car'' –

0

下面是這個問題的解決方案,希望它可以幫助別人在未來。

$items = DB::table('items')->orderBy('created_at', 'desc') 
          ->join('items_categories', 'items.item_category_id', '=', 'items_categories.category_id') 
          ->select(DB::raw('"car" AS type, 
              items.id as items___item_id, 
              items.item_title as items___item_title, 
              items_categories.id as items_categories___category_id, 
              items_categories.title as items_categories___category_title 
              ') 
            ) 
          ->take(20);