Сводная таблица Laravel прикрепляет дубликаты много раз

#php #laravel #pivot #pivot-table #laravel-7

#php #laravel #сводная #сводная таблица #laravel-7

Вопрос:

В моем проекте есть соревнование, в котором участвует много команд, и организатор может загружать много документов / фотографий на соревнование, назначая их команде, поэтому я решил создать files таблицу для хранения всех данных файла, в то время как для них есть отдельные таблицы compactions , teams и я создал сводную таблицу как competition_fileс полями competition_id team_id , file_id , и type , как показано на рисунке ниже

введите описание изображения здесь

Вот как выглядит мой пользовательский интерфейс

введите описание изображения здесь

В этой форме вы можете загружать несколько изображений / документов фотографии загружаются с помощью Ajax-запроса. Форма получает ответ uuid's изображений, загруженных в таблицу files, и снова отправляется в таблицу store functions in the documents.

Вот функция сохранения Files контроллера

 public function store(Request $request)
{
    $this->validate($request, [
        'file' => 'required|image',
    ]);

    $fh = new FileUploader($request);
    $fh->toDisk('public');

    if ($request->has('upload_dir')) {
        $fh->saveToDir($request->input('upload_dir', 'files'));
    }

    $result = $fh->upload();
    if ($result->isSuccessful()) {
        $file = new File([
            'key' => Uuid::generate(4),
            'name' => $request->name,
            'description' => $request->description,
            'allow_public_access' => false,
            'original_filename' => $result->getOriginalFilename(),
            'file_path' => $result->filePath(),
            'file_disk' => $result->diskName(),
            'file_url' => $result->publicUrl(),
            'file_size_bytes' => $result->getFileSize(),
            'uploaded_by_user_id' => (auth()->id()) ?? auth()->id()
        ]);
        $file->category = $request->input('category', 'general');
        $file->save();

        return response()->apiSuccess([
            'uuid' => $file->uuid,
        ]);
    }

    return response()->apiError('Failed to upload file. Try with another file or contact admin.');
}
 

Вот взаимосвязь в Teams модальном

 public function documents()
{
    return $this->belongsToMany(File::class,'competition_file')->wherePivot('type', 'image');
}
 

И вот функция сохранения контроллера документов

    public function store($competition, Request $request, Team $entity)
    {

    
    $uuid = $request->photos;
    File::whereIn('uuid', $uuid)->update(['name' => $request->name, 'description'=>$request->description]);        

     

     if ($request->has('photos') amp;amp; is_array($request->photos)) {
        $files = $this->filesRepo->getByUuids($request->photos);

      

        if ($files->isNotEmpty()) {

           
            $entity->documents()->attach($files->pluck('id'),['team_id'=>$request->team,'competition_id'=>$competition]);
          

          
        }
    } }
 

Мне нужно знать, что не так со сводной таблицей, я не смог использовать sync , и я использовал attach , и когда я сохраняю данные в и прикрепляю отношения, они дублируются, если я выбрал более 1 изображения / документа, как показано на рисунке ниже

введите описание изображения здесь

хотя я выбрал только 3 изображения, я получаю дубликаты ‘

вот как выглядит сводная таблица после сохранения

введите описание изображения здесь

Вот файлы миграции для competition_file таблицы

     class CreateCompetitionFileTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('competition_file', function (Blueprint $table) {
            $table->bigInteger('competition_id')->unsigned()->references('id')->on('competitions')->onDelete('cascade');
            $table->bigInteger('file_id')->unsigned()->references('id')->on('files')->onDelete('cascade');
$table->bigInteger('team_id')->unsigned()->references('id')->on('teams')->onDelete('cascade');
            $table->string('type')->default('image')->comment('image|attachment');

        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('competition_file');
    }
}
 

Кто-нибудь, пожалуйста, помогите мне.

Комментарии:

1. attach всегда будет создавать новую запись в сводной таблице. Почему синхронизация не сработала — в чем была ошибка? Вы пробовали save() laravel.com/docs/master /…

2. @Donkarnash когда я использовал sync , я получил эту ошибку SQLSTATE[HY000]: General error: 1364 Field 'competition_id' doesn't have a default value (SQL: insert into competition_file`( file_id , team_id ) значения (145, ?))`

3. Можете ли вы опубликовать файл миграции для таблицы competition_file

4. @Donkarnash Я обновил вопрос с помощью файла миграции

5. Вы пытались проверить значение для $competition, полученное в параметре метода store — ($competition) это должно быть полученное значение null. Проверьте и посмотрите. Вы также можете получить к ней доступ через $request->route(‘competition’), если это параметр маршрута. Опубликуйте маршрут для метода store