为什么第一次调用 ::create() 方法不会在 Laravel 中的模型上设置 id 字段?

问题描述 投票:0回答:1

我使用 Laravel 5.5 和 October CMS 1.0 以及 MySQL 5.6 数据库和 PHP 7.4。 我有几个带有整数自动增量

id
键的模型。 模型的默认设置保持不变——我没有更改任何与键相关的选项。

我能够使用最简单的模型重现该问题 - 仅使用

int $id
string $test
属性。

发生了什么: 当我从 Twig 模板调用方法到控制器时,第一次调用

::create
将返回一个模型,其中
$id
设置为
0
。 这两个条目均在数据库中创建。 之后,每次调用
::create()
都会返回一个已充分设置
$id
的模型。

我花了一些时间在互联网上研究这个问题,与我相关的唯一问题是连接到望远镜,但我没有使用它。

数据库字段已定义主键。 正如我提到的,只有第一次调用失败。随后的每个调用都会正常工作。 我当前解决该问题的方法是创建一个虚拟表,在继续函数逻辑之前在其中创建条目。 这很愚蠢,但它允许我在解决问题之前继续下去。

我不知道从哪里开始寻找。 最糟糕的是这个问题不会影响我的播种者。在那里,模型在调用第一个创建后立即收到

$id

欢迎任何想法。

我用于测试的代码:

数据库表:

create table if not exists inx_test_table
(
    id           int unsigned auto_increment primary key,
    name          varchar(64)      not null,
    created_at   timestamp        null,
    updated_at   timestamp        null
) collate = utf8mb4_unicode_ci;

树枝:

<div class="modal-body">
    <div class="container">
        {{
            form_open({
                'data-request': __SELF__ ~ "::onTestModel",
                'data-request-success': 'testUpdate(data)'
              })
        }}
        <div class="row">
            {{ form_input( 'text', 'test_input', '') }}
        </div>
        <div class="row ">
            <div>First ID: <span id="first_id"></span></div><div style="margin-left: 1rem">Second ID: <span id="second_id"></span></div>
        </div>
        <div class="d-flex justify-content-around mt-5">
            <div>
                {{ form_button ('Annuler', {'data-dismiss':'modal', 'class': 'btn btn-secondary'} ) }}
            </div>
            <div>
                {{ form_submit ('Suite ...', {'class': 'btn btn-primary' } )}}
            </div>
        </div>
        {{ form_close() }}
    </div>
</div>

<script>
    function testUpdate(data) {
        console.log(data);
        $('#first_id').text(data.first_id);
        $('#second_id').text(data.second_id);
    }
</script>

控制器功能:

public function onTestModel() {
    $data = input();
    $model1 = TestModel::create([
        'name' => $data['test_input']
    ]);
    $model2 = TestModel::create([
        'name' => $data['test_input']
    ]);

    return ["first_id" => $model1->id, "second_id" => $model2->id];
}

型号:

<?php


/**
 *
 * @mixin \October\Rain\Database\Model
 * @property int $id
 * @property string $name
 * @method static \October\Rain\Database\Collection|static[] all($columns = ['*'])
 * @method static \October\Rain\Database\Collection|static[] get($columns = ['*'])
 * @method static \October\Rain\Database\Builder|FormationsDuoTypes newModelQuery()
 * @method static \October\Rain\Database\Builder|FormationsDuoTypes newQuery()
 * @method static \October\Rain\Database\Builder|FormationsDuoTypes query()
 * @mixin \Eloquent
 * @noinspection PhpFullyQualifiedNameUsageInspection
 * @noinspection PhpUnnecessaryFullyQualifiedNameInspection
 */
class TestModel extends Model
{
    use \October\Rain\Database\Traits\Validation;

    /**
     * The connection associated with the model.
     *
     * @var string
     */
    protected $connection = 'inx';

    /**
     * @var string The database table used by the model.
     */
    public $table = 'test_table';

    /**
     * @var array Validation rules for attributes
     */
    public $rules = [
        'name' => 'required',
    ];

}
php laravel laravel-5 octobercms
1个回答
0
投票

使用

NOT NULL
主键约束创建表

create table if not exists inx_test_table
(
    id int unsigned NOT NULL auto_increment primary key,
    ...
)

并在您的模型中添加

$fillable

protected $fillable = [
    'name'
];
© www.soinside.com 2019 - 2024. All rights reserved.