创建模型后,当我尝试获取其属性时,我只获得数据库中填充的字段。
----------------------------------------------
DB: | id | shopID | name | bottleID | capacity |
----------------------------------------------
| 1 | 8 | Cola | 3 | |
----------------------------------------------
在这种情况下,我也需要capacity属性,作为空字符串
public function getDrinkData(Request $request)
{
$drink = Drink::where('shopId', $request->session()->get('shopId'))->first();
if($drink) {
$drink = $drink->attributesToArray();
}
else {
$drink = Drink::firstOrNew(['shopId' => $request->session()->get('shopId')]);
$drink = $drink->attributesToArray(); // i want to get even empty fields
}
return view('shop.drink')->(['drink' => $drink])
}
但是为了以后的使用(在视图中),我需要拥有所有属性,包括空属性。我知道这段代码可以正常运行,但我不知道如何更改它以检测所有属性。
答案 0 :(得分:12)
您可以使用Schema::getColumnListing($tableName)
获取表格中所有列的数组。使用该信息,您可以创建一个基本数组,其中包含所有列名称作为键,并为所有值创建null
,然后合并Drink
对象的值。
public function getDrinkData(Request $request)
{
$drink = Drink::where('shopId', $request->session()->get('shopId'))->first();
if($drink) {
$drink = $drink->attributesToArray();
}
else {
$drink = Drink::firstOrNew(['shopId' => $request->session()->get('shopId')]);
// get the column names for the table
$columns = Schema::getColumnListing($drink->getTable());
// create array where column names are keys, and values are null
$columns = array_fill_keys($columns, null);
// merge the populated values into the base array
$drink = array_merge($columns, $drink->attributesToArray());
}
return view('shop.drink')->(['drink' => $drink])
}
答案 1 :(得分:1)
如果要显式声明要返回的所有字段怎么办。
我做的一个例子比较基本,因为我不使用where子句,而只是从Request对象获取所有内容。我仍然认为这对外面的人可能会有帮助。
public function getDrinkData(Request $request)
{
// This will only give back the columns/attributes that have data.
// NULL values will be omitted.
//$drink = $request->all();
// However by declaring all the attributes I want I can get back
// columns even if the value is null. Additional filtering can be
// added on if you still want/need to massage the data.
$drink = $request->all([
'id',
'shopID',
'name',
'bottleID',
'capacity'
]);
//...
return view('shop.drink')->(['drink' => $drink])
}
答案 2 :(得分:0)
你应该在你雄辩的模型上添加一个$ fillable数组
protected $fillable = ['name', 'email', 'password'];
确保输入您需要的所有字段的名称,或者您可以使用" *"选择所有。
如果您已经拥有该功能,则可以使用->toArray()
方法获取所有属性,包括空属性。
我对Post
模型使用相同的东西,它适用于所有字段,包括空字段。
我的模型看起来像这样:
namespace App;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
protected $fillable = ["*"];
public function comments()
{
return $this->hasMany(Comment::class);
}
}
答案 3 :(得分:0)
检查$ drink变量后,是否需要再次设置$ drink变量?
您可以查看以下代码吗?
public function getDrinkData(Request $request)
{
$drink = Drink::where('shopId', $request->session()->get('shopId'))->first();
if(!count($drink)>0) {
$drink = Drink::firstOrNew(['shopId' => $request->session()->get('shopId')]);
}
return view('shop.drink')->(['drink' => $drink]); or
return view('shop.drink',compact('drink'));
}
希望它会有所帮助。 :):)
答案 4 :(得分:-2)
您可以通过覆盖attributesToArray
方法
class Drink extends Model
{
public function attributesToArray()
{
$arr = parent::attributesToArray();
if ( !array_key_exist('capacity', $arr) ) {
$arr['capacity'] = '';
}
return $arr;
}
}
或toArray
方法
class Drink extends Model
{
public function toArray()
{
$arr = parent::toArray();
if ( !array_key_exist('capacity', $arr) ) {
$arr['capacity'] = '';
}
return $arr;
}
}
然后
$dirnk->toArray(); // here capacity will be presented even it null in db