从Laravel中的db模型获取所有字段

时间:2016-06-15 12:54:14

标签: php laravel laravel-5

创建模型后,当我尝试获取其属性时,我只获得数据库中填充的字段。

    ----------------------------------------------
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])
}

但是为了以后的使用(在视图中),我需要拥有所有属性,包括空属性。我知道这段代码可以正常运行,但我不知道如何更改它以检测所有属性。

5 个答案:

答案 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