#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