Php Laravel 6-`未定义变量:值`首次出现唯一错误

Php Laravel 6-`未定义变量:值`首次出现唯一错误,php,laravel,laravel-6,Php,Laravel,Laravel 6,在我第一次想从表中将数据保存到数据库时,会出现此错误 错误例外 未定义变量:值 因此,我必须从tinker或mysql 我的控制器 public function store(Request $request) { $validateData = $request->validate([ 'name_device_type' => 'required|max:255', 'signature' => 'Nullable'

在我第一次想从表中将数据保存到数据库时,会出现此错误

错误例外 未定义变量:值

因此,我必须从
tinker
mysql

我的控制器

public function store(Request $request)

{

    $validateData = $request->validate([

        'name_device_type' => 'required|max:255',

        'signature' => 'Nullable'

    ]);



    $id = DeviceType::getidDeviceTypes();

    foreach ($id as $value);   // Error happend in this line.

    $lastdevicetypeId = $value->id;

    $newdevicetypeId = $lastdevicetypeId + 1;

    $GetnewdevicetypeId = sprintf('DT%04d', $newdevicetypeId);



    $devicetypes = new DeviceType();

    $devicetypes->idDeviceType = $GetnewdevicetypeId;

    $devicetypes->name_device_type = $request->input('name_device_type');

    $devicetypes->signature = $request->input('signature');

    $devicetypes->save();



    return redirect('/devicetypes')->with('success', 'New Device Type is added');

}
我的迁移表

public function up()
    {
        Schema::create('device_types', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('idDeviceType');
            $table->string('name_device_type');
            $table->mediumText('signature');
            $table->timestamps();
        });
    }
My create.blade.php

{!! Form::open(['action' => 'DeviceTypesController@store', 'method' => 'POST']) !!}
        <div class="form-group">
            {!! Form::label('name_device_type', 'Type Device'); !!}
            {!! Form::text('name_device_type', '', ['class' => 'form-control', 'placeholder' => 'Type Device']); !!}
        </div>
        <div class="form-group">
            {!! Form::label('signature', 'Signature (Optional)'); !!}
            {!! Form::textarea('signature', '', ['id' => 'classic-ckeditor5', 'class' => 'form-control', 'placeholder' => 'Signature']); !!}
        </div>
        {{ Form::button('<i class="far fa-save"></i> Submit', ['type' => 'submit', 'class' => 'btn btn-info'] )  }}
    {!! Form::close() !!}

但是,如果表中有数据,此错误将消失,如果我删除所有数据并使表为空,此错误也将再次出现。

foreach
循环定义之后有一个分号:
foreach($id as$value)
您正在下一行中使用
$value
$lastdevicetypeId=$value->id超出循环的范围

您应该删除
foreach
循环之后,将其更改为
并添加一个
endforeach要结束循环的位置

例如:

foreach ($id as $value):
    $lastdevicetypeId = $value->id;
    $newdevicetypeId = $lastdevicetypeId + 1;
    $GetnewdevicetypeId = sprintf('DT%04d', $newdevicetypeId);

    $devicetypes = new DeviceType();
    $devicetypes->idDeviceType = $GetnewdevicetypeId;
    $devicetypes->name_device_type = $request->input('name_device_type');
    $devicetypes->signature = $request->input('signature');
    $devicetypes->save();
endforeach;
或者,您可以将此代码编写为:

foreach ($id as $value){
    $lastdevicetypeId = $value->id;
    $newdevicetypeId = $lastdevicetypeId + 1;
    $GetnewdevicetypeId = sprintf('DT%04d', $newdevicetypeId);

    $devicetypes = new DeviceType();
    $devicetypes->idDeviceType = $GetnewdevicetypeId;
    $devicetypes->name_device_type = $request->input('name_device_type');
    $devicetypes->signature = $request->input('signature');
    $devicetypes->save();
}

您可以获取表的最大“id”并向其中添加1,而无需获取整个记录:

...
// validation

$newdevicetypeId = DeviceType::max('id') + 1;

$GetnewdevicetypeId = sprintf('DT%04d', $newdevicetypeId);

// new DeviceType
...

有一个模型事件选项,可以在创建记录后设置此特定字段,使其具有自己的id以供使用。

检查
$id=DeviceType::getidDeviceTypes()已计数。因此,如果(isset($id)&&count($id)>0){//将foreach循环代码放在这里,甚至对foreach代码使用花括号,这将更加清楚}
@Qirel分号没有终止循环,它仍然在迭代并将值分配给
$value
。。。只是循环没有运行,因为它们没有要迭代的记录over@lagbox是什么让你认为没有记录?在他们添加数据后,它工作了,因为循环运行并且有一个
$value
变量。。。当没有记录(空表-“第一次”)时,就没有可迭代的内容,因此永远不会有
$value
变量created@Daedalus其中一个从OP那里获得更多信息会有所帮助。。。它可能只是想得到某个特定事物的最后一个记录,然后循环技术上做到了这一点。。。或者可能是该代码的一部分属于循环中,该循环意味着要在每个项目上运行,这些项目可能是打字错误/结构性问题您的答案确实删除了错误消息,但我有一个新问题,即数据没有保存到数据库中。
$id
变量是否有一个集合或数组?你检查过了吗?如果没有,请在
foreach
循环之前尝试
dd($id)
。如果它是空的,那么您应该检查
DeviceType::getidDeviceTypes()
以了解它不返回任何数据的原因。
id
是创建迁移表时默认的
bigincrement
Laravel。is
DeviceType::getidDeviceTypes()
返回数组或集合?此代码仍然存在一个问题,即它总是返回
DT0001
。显示
DeviceType
模型的
getidDeviceTypes
方法i添加它检查问题
...
// validation

$newdevicetypeId = DeviceType::max('id') + 1;

$GetnewdevicetypeId = sprintf('DT%04d', $newdevicetypeId);

// new DeviceType
...