代码之家  ›  专栏  ›  技术社区  ›  Aasem Shoshari

Laravel:字段“name”没有默认值

  •  0
  • Aasem Shoshari  · 技术社区  · 2 年前

    我正在通过本地测试路线 postman ,正在发送 JSON 具有创建事件所需的属性和值的对象:

    // http://127.0.0.1:8000/api/events
    {
        "name": "Event 1",
        "description": "Event 1 description",
        "start_time": "2024-01-01 15:00:00",
        "end_time": "2024-01-01 16:00:00"
        
    }
    

    模型 Event

    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
    use Illuminate\Database\Eloquent\Relations\BelongsTo;
    use Illuminate\Database\Eloquent\Relations\HasMany;
    
    class Event extends Model
    {
        use HasFactory;
    
        protected $fillable = [
            'name',
            'description',
            'start_time',
            'end_time',
            'user_id',
        ];
    
        public function user(): BelongsTo
        {
            return $this->belongsTo(User::class);
        }
    
        public function attendee(): HasMany
        {
            return $this->hasMany(Attendee::class);
        }
    }
    

    EventController

    <?php
    
    namespace App\Http\Controllers\Api;
    
    use App\Http\Controllers\Controller;
    use App\Models\Event;
    use Illuminate\Http\Request;
    
    class EventController extends Controller
    {
        public function store(Request $request)
        {
            $event = Event::create([
                $request->validate([
                    'name' => 'required|string|max:255',
                    'description'=>'nullable|string',
                    'start_time' => 'required|date',
                    'end_time'=> 'required|date|after:start_time',
                ]),
                'user_id'=>1
            ]);
    
            return $event;
        }
    }
    

    但我得到了这个错误对象响应:

    "message": "SQLSTATE[HY000]: General error: 1364 Field 'name' doesn't have a default value (Connection: mysql, SQL: insert into `events` (`user_id`, `updated_at`, `created_at`) values (1, 2023-12-02 18:01:52, 2023-12-02 18:01:52))"
    

    读取该消息时,控制器似乎没有接收到任何数据,因为它甚至没有尝试将它们插入到表中(name、description、start_time、end_time)

    读到这个错误,一些建议是我没有将这些列添加到我的$fillable中,另一个建议是我将数据发送到数据库,并免除不可为null的字段或不能为空的字段。

    但我没有犯这些错误,那么问题出在哪里呢?提前谢谢。

    如果需要,请毫不犹豫地要求另一个代码块。 请注意,列和伪数据是使用数据库工厂和种子程序生成的。

    这里还有活动 migrations :

    <?php
    
    use App\Models\User;
    use Illuminate\Database\Migrations\Migration;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Support\Facades\Schema;
    
    return new class extends Migration
    {
        /**
         * Run the migrations.
         */
        public function up(): void
        {
            Schema::create('events', function (Blueprint $table) {
                $table->id();
                $table->foreignIdFor(User::class);
                $table->string('name');
                $table->text('description')->nullable();
                $table->dateTime('start_time');
                $table->dateTime('end_time');
    
                $table->timestamps();
            });
        }
    
        /**
         * Reverse the migrations.
         */
        public function down(): void
        {
            Schema::dropIfExists('events');
        }
    };
    
    1 回复  |  直到 2 年前
        1
  •  0
  •   matiaslauriti    2 年前

    您传递的是数据数组的数组,而不是数据数组,这将起作用:

    namespace App\Http\Controllers\Api;
    
    use App\Http\Controllers\Controller;
    use App\Models\Event;
    use Illuminate\Http\Request;
    
    class EventController extends Controller
    {
        public function store(Request $request)
        {
           $request->validate([
                'name' => 'required|string|max:255',
                'description' => 'nullable|string',
                'start_time' => 'required|date',
                'end_time' => 'required|date|after:start_time',
           ]);
    
            $event = Event::create([
                'name' => $request->name,
                'description' => $request->description,
                'start_time' => $request->start_time,
                'end_time' => $request->end_time,
                'user_id' => 1,
            ]);
    
            return $event;
        }
    }
    

    您的代码正在执行以下操作:

    $data = $request->validate([
        'name' => 'required|string|max:255',
        'description' => 'nullable|string',
        'start_time' => 'required|date',
        'end_time' => 'required|date|after:start_time',
    ]);
    
    $event = Event::create(
        [
            $data,
            'user_id' => 1,
        ]
    );
    

    所以,你的数据是这样的:

    $data = [
        0 => [
            'name' => 'name value',
            'description' => 'description value',
            'start_time' => 'start time value',
            'end_time' => 'end time value',
        ],
        'user_id' => 1,
    ];
    

    但你希望它是这样的:

    $data = [
        'name' => 'name value',
        'description' => 'description value',
        'start_time' => 'start time value',
        'end_time' => 'end time value',
        'user_id' => 1,
    ];
    

    所以,事实上,你已经 name 丢失的这也是方式 user_id 是已尝试的查询中唯一完成的值(请检查错误),但所有其他值都丢失了。

    推荐文章