laravel 8存储请求与外键user_id不工作



我想在添加新学校数据时存储相应的登录用户。我要做的是在学校表中存储登录的user_id,以便知道谁添加了学校数据。我已经有了一个users表,它将在schools表中建立关系。

我的目标是当管理员登录时,他/她可以看到所有的学校记录,否则,如果它是一个用户,那么只获取他/她添加的记录。问题是,我无法弄清楚何时何地插入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');
}
}

任何输入将是很大的帮助!谢谢。

Laravel有一种优雅的方式来绑定已认证的user_id。从请求类和链接方法中删除user_id。也建立从用户模型到学校模型的关系

表单请求类

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值是学校名称(基于评论中的图像链接),可能在用户或学校模型中有问题。这里是快速修复

控制器

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');
}
}

可以在表中添加'created_by'和'updated_by'字段。因此,当进行添加或更新时,您可以在这些字段中注册。然后,您可以看到谁添加或更新了这些字段。

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()..

你必须safe()->将user_id合并到其中,这里Docs: .

$ = $请求验证→安全()→合并(["user_id"=比;身份验证:用户()→id]);

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

最新更新