[英]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>
如您所見,有些字段具有默認值: name
和priority
。
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[]
不能包含name
或priority
(它們是從 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.