#laravel #eloquent #many-to-many
#laravel #красноречивый #многие ко многим
Вопрос:
надеюсь, у вас хороший день.
итак, у меня есть эта ManyToMany
связь, в которой пользователь может подать заявку на несколько заданий, а у задания может быть несколько кандидатов (пользователей).
вот схема таблицы
Schema::create('applicant_job', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('job_id');
$table->unsignedBigInteger('applicant_id');
$table->unique(['job_id', 'applicant_id']);
$table->foreign('job_id')
->references('id')
->on('jobs')
->onDelete('cascade');
$table->foreign('applicant_id')
->references('id')
->on('default_users')
->onDelete('cascade');
});
и вот код модели.
DefaultUser.php
class DefaultUser extends Model
{
public function user()
{
return $this->morphOne(User::class, 'userable');
}
public function applications()
{
return $this->belongsToMany(Job::class, 'applicant_job', 'job_id', 'applicant_id');
}
}
и Job.php
class Job extends Model
{
public function owner()
{
return $this->belongsTo(BusinessUser::class, 'business_user_id');
}
public function applicants()
{
return $this->belongsToMany(DefaultUser::class, 'applicant_job', 'applicant_id', 'job_id');
}
}
кажется, все в порядке и найдено, однако, когда я пытаюсь сохранить (пользователь, подающий заявку на задание), я получаю следующую ошибку
я делаю это внутри ApplyToJobController.php
class ApplyToJobController extends Controller
{
public function store(Job $job, Request $request) {
$default_user = auth()->user()->userable;
$job->applicants()->attach($default_user->id);
return redirect("/en");
}
}
и большое вам спасибо за ваши ответы.
Редактировать
я изменил имена столбцов на это
Schema::create('applicant_job', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('job_id');
$table->unsignedBigInteger('default_user_id');
$table->unique(['job_id', 'default_user_id']);
$table->foreign('job_id')
->references('id')
->on('jobs')
->onDelete('cascade');
$table->foreign('default_user_id')
->references('id')
->on('default_users')
->onDelete('cascade');
});
это заставило его работать, мне любопытно, почему?
Ответ №1:
Попробуйте изменить порядок внешних ключей в отношении заявителей, объявленном в модели задания, как в примере ниже :
public function applicants()
{
return $this->belongsToMany(DefaultUser::class, 'applicant_job', 'job_id', 'applicant_id');
}
Комментарии:
1. это сработало успешно, есть идеи, почему это произошло?
2. Это связано с порядком аргументов метода belongToMany, попробуйте проверить его сигнатуру в черте HasRelationships