从 Laravel 中的数据库模型中获取所有字段

新手上路,请多包涵

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

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

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

原文由 Ivan Vulović 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

通过从数据库中读取数据来填充模型属性。当使用 firstOrNew() 并且记录不存在时,它会创建一个 new 模型对象的实例而不从数据库中读取,因此它具有的唯一属性将是手动分配的属性.此外,由于数据库中还没有记录,您不能只是重新读取数据库来获取丢失的数据。

在这种情况下,您可以使用 Schema::getColumnListing($tableName) 获取表中所有列的数组。有了这些信息,您可以创建一个基本数组,将所有列名称作为键, null 用于所有值,然后合并到你的值 Drink 对象。

 public function getDrinkData(Request $request)
{
    // firstOrNew will query using attributes, so no need for two queries
    $drink = Drink::firstOrNew(['shopId' => $request->session()->get('shopId')]);

    // if an existing record was found
    if($drink->exists) {
        $drink = $drink->attributesToArray();
    }
    // otherwise a new model instance was instantiated
    else {
        // 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])
}

如果您使用的是 firstOrCreate() ,那么当一个记录不存在时会创建一个新记录。由于现在数据库中有记录,您可以简单地从数据库中重新读取记录以填充所有模型属性。例如:

 public function getDrinkData(Request $request)
{
    $drink = Drink::firstOrCreate(['shopId' => $request->session()->get('shopId')]);

    // If it was just created, refresh the model to get all the attributes.
    if ($drink->wasRecentlyCreated) {
        $drink = $drink->fresh();
    }

    return view('shop.drink')->(['drink' => $drink->attributesToArray()])
}

原文由 patricus 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您要显式声明您想要返回的所有字段怎么办。

我做的事情的一个例子是更基本的,因为我没有使用 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])
}

原文由 Rockin4Life33 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏