laravel 8 使用外键存储请求 user_id 无效

laravel 8 store request with foreign key user_id not working

我想在添加新学校数据时存储相应的登录用户。我想要做的是将登录 user_id 存储在学校 table 中,以便了解是谁添加了学校数据。我已经有一个用户 table,这将在学校 table.

中建立关系

我的目标是当管理员登录时,he/she 可以看到所有学校记录,否则如果是用户,则只获取 he/she 添加的记录。问题是我无法弄清楚在商店请求期间何时何地插入 user_id 数据,因为我收到错误“需要用户 ID 字段”。到目前为止,这是我尝试过的方法:

迁移:

class CreateSchoolsTable extends Migration
{
public function up()
    {
        Schema::create('schools', function (Blueprint $table) {
            $table->id();
            $table->string('school_name');
            $table->foreignId('user_id')->constrained()->cascadeOnDelete();
            $table->timestamps();
        });
    }
}

学校型号:

class School extends Model
{
    use HasFactory;

    protected $fillable = ['school_name', 'user_id'];


    public function User() {
        return $this->belongsTo(User::class);
    }

}

存储请求:

class StoreSchoolRequest extends FormRequest
{
    public function rules(): array
    {
        return [
            'school_name' => 'required|string|max:255',
            'user_id' => 'required|exists:users,id'
        ];
    }
}

控制器:

class SchoolController extends Controller
{
    public function store(StoreSchoolRequest $request) {
        $school_data = $request->validated();
        $user_id = \Auth::user()->id;
        $school_data['user_id'] = $user_id;

        School::create($school_data );

        return Redirect::route('schools.index');
    }
}

任何输入都会有很大帮助!谢谢。

您可以将 'created_by' 和 'updated_by' 字段添加到 table。因此您可以在添加或更新时在这些字段中注册。 然后您可以从这些字段中看到谁添加或更新了。

class School extends Model
{
    use HasFactory;

    protected $fillable = ['school_name', 'user_id', 'created_by', 'updated_by'];


    public function User() {
        return $this->belongsTo(User::class);
    }

}

您的控制器部分是正确的,但由于您获得了登录用户,因此您不会在请求中包含 user_id。因此,您应该从 StoreSchoolRequest.

中删除有关 user_id 的规则
class StoreSchoolRequest extends FormRequest
{
    public function rules(): array
    {
        return [
            'school_name' => 'required|string|max:255'
        ];
    }
}

问题出在这里..

$school_data = $request->validated();

由于您正在使用 $request->validated()..

你必须 safe()->merge user_id 进去,here Docs : .

$validated = $request->safe()->merge(['user_id' => Auth::user()->id]);

然后将这个 $validated 放入创建查询中,谢谢。 –

Laravel 有优雅的方式来绑定已验证的 user_id。从请求 class 和链接方法中删除 user_id。还设置从用户模型到学校模型的关系

表单请求Class

class StoreSchoolRequest extends FormRequest
{
    public function rules(): array
    {
        return [
            'school_name' => 'required|string|max:255',
        ];
    }
}

用户模型

protected $fillable = ['school_name', 'user_id'];
...
// new line
public function schools() {
   return $this->hasMany(School::class);
}

你的控制器

class SchoolController extends Controller
{
    public function store(StoreSchoolRequest $request) {
        auth()->user()->schools()->create($request->validated());
        return Redirect::route('schools.index');
    }
}

更新答案

由于 user_id 值是学校名称(基于评论中的图像 link),可能是用户或学校模型有问题。这里是快速修复

你的控制器

class SchoolController extends Controller
{
    public function store(StoreSchoolRequest $request) {
        auth()->user()->schools()->create(
            array_merge(
                $request->validated(), 
                ['user_id' => auth()->id()]
            )
         );
        return Redirect::route('schools.index');
    }
}