Laravel: не удается вставить в отношения «многие ко многим»

#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