@m4son

Как в Laravel 9 работать с pivot?

Подскажите. Делаю файловый менеджер и нужно реализовать доступы. Связи: файл, категория файла, пользователь, категория пользователей.

(Может подскажите другую реализацию, если я делаю неправильно или неуместно)

Вот таблица из миграции:
Schema::create('access_file_user_file_category_user_category', function (Blueprint $table) {
            $table->id();
            $table->integer("model_file_id");
            $table->integer("model_user_id");
            $table->enum('model_files', ["file", "file_category"]);
            $table->enum('model_users', ["user", "user_category"]);
            $table->enum('access', ["allow", "disallow"]);
            $table->timestamps();
        });

Вот в модели связь:
public function access($value) {
        switch ($value) {
            case "user":
                $class = User::class;
                break;
            case "user_category":
                $class = UserCategory::class;
                break;
        }
        return $this->belongsToMany($class, "access_file_user_file_category_user_category", "model_file_id", "model_user_id")->withTimestamps()->withPivot(['model_files', 'model_users', 'access']);
    }

Вот код для создания связей, работает правильно:
$category->access()->syncWithPivotValues(["5", "7"], [
            "model_files" => "file_category",
            "model_users" => "user",
            "access" => "disallow",
        ]);


А вот как получить данные ? Данный код не работает:
$accessUsers = $category->access()->wherePivot('access', '=', "disallow")->wherePivot('model_files', '=', "file_category")->wherePivot('model_users', '=', "user")->get();
  • Вопрос задан
  • 259 просмотров
Пригласить эксперта
Ответы на вопрос 1
toratoda
@toratoda
Если я понял правильно твою идею, то тебе требуется полиморфная связь:
Schema::create('access_file_user_file_category_user_category', function (Blueprint $table) {
            $table->id();
            $table->morph('who');
            $table->morph('what');
            $table->enum('access', ["allow", "disallow"]);
            $table->timestamps();
        });

в who ты будешь присваивать либо модель пользователя, либо модель категории пользователя;
в what по аналогии будешь присваивать либо модель файла, либо модель категории файлов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы