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');
}
}
我想在添加新学校数据时存储相应的登录用户。我想要做的是将登录 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');
}
}