簡體   English   中英

Laravel 6.x - 'create()' 使用數據庫默認值的記錄

[英]Laravel 6.x - 'create()' record using DataBase DEFAULT values

我有一個簡單的 MySQL 數據庫表,如下所示:

mysql> show create table provenance;
| provenance | CREATE TABLE `provenance` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Unique incremental id',
  `name` char(255) NOT NULL DEFAULT 'AUTO-ADDED',
  `instance` char(255) NOT NULL,
  `username` char(255) DEFAULT NULL COMMENT 'User name',
  `priority` int(11) NOT NULL DEFAULT '0' COMMENT 'Provenance priority',
  `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `inserted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=2869 DEFAULT CHARSET=latin1 COMMENT='Provenance' |
mysql> 

如您所見,有些字段具有默認值: namepriority

Laravel Model類似於:

class ProvenanceModel extends Model
{
    protected $table = 'provenance';
    protected $fillable = [
        'name',
        'instance',
        'username',
        'priority'
    ];
}

Controller

class ProvenanceController extends Controller
{
    public function myStore($array)
    {
        return ProvenanceModel::firstOrCreate(
            [
                'name'          => $array['name'],
                'instance'      => $array['instance'],
                'username'      => $array['username'],
                'priority'      => $array['priority'],
            ]
        );
    } 
}

問題是輸入$array[]不能包含namepriority (它們是從 DataBase 使用DEFAULT設置的)。

但是我如何更改我的代碼以避免錯誤,例如$array['name']不存在?

一個想法可能是將Controller代碼更改為:

class ProvenanceController extends Controller
{
    public function myStore($array)
    {
        return ProvenanceModel::firstOrCreate(
            [
                'name'          => $array['name'] ?? 'AUTO-ADDED',
                'instance'      => $array['instance'],
                'username'      => $array['username'],
                'priority'      => $array['priority'] ?? 0,
            ]
        );
    } 
}

但如果我更改 DB 上的DEFAULT ,我需要更改 PHP 代碼,我不喜歡這樣。

如果字段未通過,有沒有辦法使用默認數據庫值?

謝謝你。

Laravel 在構造查詢時無法知道數據庫默認值是什么。

您最好的選擇是將firstOrCreate拆分為 2 個調用:

$model = ProvenanceModel::where($attributes)->first();

if (is_null($model)) {
    $model = ProvenanceModel::create([
        ...
        // non-default attributes
        ...
    ]);
}

return $model;

在@prgrm 注釋之后,解決方案是插入ProvenanceModel::create()方法,僅在輸入中接收字段。

例如:

class ProvenanceController extends Controller
{
    public function myStore($array)
    {
        isset($array['name']) ? $secondArray['name'] = $array['name'] : null;
        isset($array['instance']) ? $secondArray['instance'] = $array['instance'] : null;
        isset($array['username']) ? $secondArray['username'] = $array['username'] : null;
        isset($array['priority']) ? $secondArray['priority'] = $array['priority'] : null;

        return ProvenanceModel::firstOrCreate($secondArray);
    } 
}

那么如果$array['name']沒有設置$secondArray將是:

$secondArray[
    'instance' => '<value>'
    'username' => '<value>'
    'priority' => '<value>'
]

並且name字段將填充DEFAULT MySQL value, 'AUTO-ADDED'


要在一行中完成所有操作且無需構建$secondArray()

class ProvenanceController extends Controller
{
    public function myStore($array)
    {
        return ProvenanceModel::firstOrCreate(
            [
                isset($array['name']) ? 'name' : 'xx' => $array['name'] ?? null,
                isset($array['instance']) ? 'instance' : 'xx' => $array['instance'] ?? null,
                isset($array['username']) ? 'username' : 'xx' => $array['username'] ?? null,
                isset($array['priority']) ? 'priority' : 'xx' => $array['priority'] ?? null,
            ]
        );
    } 
}

那么如果$array['name']沒有設置,它將是:

        return ProvenanceModel::firstOrCreate(
            [
                'xx' => null,
                'instance' => <value>,
                'username' => <value>,
                'priority' => <value>,
            ]
        );

xx字段不在$fillable數組中,不會在INSERT語句中使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM