【问题标题】:Laravel 6.x - 'create()' record using DataBase DEFAULT valuesLaravel 6.x - 'create()' 使用数据库默认值的记录
【发布时间】:2019-11-14 10:32:54
【问题描述】:

我有一个简单的 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> 

如您所见,存在 DEFAULT 值的字段:namepriority

Laravel 模型类似于:

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

控制器

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(它们是从数据库中用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 代码,但我不喜欢这样。

如果字段未通过,有没有办法使用DEFAULT数据库值?

谢谢。

【问题讨论】:

  • 如果您没有在名称或优先级中插入任何内容,很确定它已经自动完成

标签: php mysql laravel eloquent laravel-6


【解决方案1】:

Laravel 在构造查询时无法知道数据库的默认设置。

您最好的选择是将firstOrCreate 拆分为 2 个调用:

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

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

return $model;

【讨论】:

    【解决方案2】:

    在@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 值 '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 语句中使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-10
      相关资源
      最近更新 更多