我想知道如何创建一个名为“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);
这很好用。但是,我需要为此选择的每个记录获取/添加自定义键和值,以便稍后在模板中使用它来进一步过滤内容。
所以,我需要添加一个名为type
的密钥,其值为car
,因此在print_r中我会看到type =>每个记录的车,我可以在我的代码中使用它。
怎么做?
我可以将该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 :(得分:9)
您可以使用此方法:
$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();
享受它!
答案 1 :(得分:1)
您需要为items表创建一个模型并以这种方式进行查询。使用eloquent,您可以通过向$ appends属性添加列名然后定义模型属性来动态创建列。
php artisan make:model Item
任何模型都会自动查找模型名称的复数表(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';
}
现在更新您的查询以使用模型而不是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();
在使用Model返回集合与DB :: select时,需要添加get()作为最终方法。
答案 2 :(得分: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);
答案 3 :(得分:0)
我像这个示例一样实现
$first = Message::where('from_id', '=', Auth::user()->id)
->where('to_id', '=', $id)->get();
foreach ($first as $f)
$f->is_sent = true;
$second = Message::where('from_id', '=', $id)
->where('to_id', '=', Auth::user()->id)->get();
foreach ($second as $s)
$s->is_sent = false;
$chats = $first->merge($second)
->sortBy('created_at');
return $chats->toJson();
您可以通过每个after get()方法来实现
答案 4 :(得分:0)
我遇到了同样的要求,我知道现在已经晚了,但它可能会在未来对某人有所帮助:
这是我的代码,如何在 Laravel eloquent 模型中添加自定义字段
$searchResults = Blog::with('categories')
->where('title', 'like', "%{$keyword}%")
->orWhere('description', 'like', "%{$keyword}%")
->select(['*', DB::raw("'{$keyword}' as keyword")])
->get();
谢谢