向Laravel中的选择查询添加一个带有值的新列

Joh*_*kij 6 php mysql select laravel eloquent

我想知道如何创建一个名为"type"的默认变量,并在Laravel中执行select连接时将值设置为"car".

到目前为止,这是我的代码:

$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);
Run Code Online (Sandbox Code Playgroud)

这很好用.但是,我需要为此选择的每个记录获取/添加自定义键和值,以便稍后我可以在模板中使用它来进一步过滤内容.

所以,我需要在print_r中添加一个名为so 的键type,car我会在每个记录中看到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'
        )
Run Code Online (Sandbox Code Playgroud)

因为现在我得到这个:

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
        )
Run Code Online (Sandbox Code Playgroud)

我希望得到这个:

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
        )
Run Code Online (Sandbox Code Playgroud)

如果可能,不是在模型文件中,而是在一次查询期间,因为只需要一次我需要进行此修改.

W. *_*Dan 14

您可以使用此方法:

$data = DB::table('items')
   ->Select('items.id as items___item_id',
            'items.item_title as items___item_title');

# Add fake column you want by this command
$data = $data->addSelect(DB::raw("'fakeValue' as fakeColumn"));

$data = $data->orderBy('items.id')->get();
Run Code Online (Sandbox Code Playgroud)

好好享受!


Rob*_*eca 11

您将希望为您的 items 表创建一个模型并以这种方式查询它。使用 eloquent,您可以通过将列名添加到 $appends 属性然后定义模型属性来动态创建列。

php artisan make:model Item
Run Code Online (Sandbox Code Playgroud)

任何模型都会自动查找作为模型名称复数形式的表(Item 查找“items”)。在 Item 模型中,添加以下几行

/**
 * 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';
}
Run Code Online (Sandbox Code Playgroud)

现在更新您的查询以使用模型而不是 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();
Run Code Online (Sandbox Code Playgroud)

当使用模型返回集合与 DB::select 时,您需要添加 get() 作为最终方法。