Модель загрузки полиморфных отношений Laravel по имени морфа и внешнему ключу - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь создать комментарий к комментируемой модели (которая создается с использованием полиморфных отношений.) С помощью ключа morphname.

Например; Я хотел бы создать комментарий с именем морфинга (блог) и foreign_key (1). Но название морфа может измениться. Поэтому мы не знаем, какой ключ может быть в запросе. Я не хочу создавать действия для каждого ресурса.

AppServiceProvider:

Relation::morphMap([
    'blog' => \App\Models\Blog\BlogPost::class,
    'product' => \App\Models\Commerce\Product::class,
]);

Контроллер -> действие:

$this->validate($request, [
    'commentable_model' => 'required|string',
    'commentable_id' => 'required|integer|min:1',
    'comment' => 'required|string'
]);

// i am trying to load data using morph name and foreign key here; but it's not working.
$model = $request->commentable_model::findOrFail($request->commentable_id);

$comment = new Comment;
$comment->comment = $request->comment;
$comment->commentable()->associate($model);
$comment->user()->associate(auth('api')->user());
$comment->save();

Комментируемое отношение:

Schema::create('comments', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('user_id')->unsigned();
    $table->text('comment');
    $table->integer('parent_id')->unsigned()->nullable();
    $table->foreign('parent_id')->references('id')->on('comments')->onDelete('cascade');
    $table->morphs('commentable');
    $table->timestamps();
});

Данные:

commentable_model => 'блог', commentable_id => 1

Я отправлю эти данные через конечные точки API. Итак, я хотел бы использовать только имена morhpnames, а не полные имена классов.

Я не мог заставить его работать.

Есть идеи?

1 Ответ

0 голосов
/ 26 марта 2019

Я нашел решение, и оно все время было у меня на глазах ...

Мы делаем отображение, используя класс Relation.

Я проверил, можем ли мы получить доступ к отношениям с помощью любого метода или переменных, и ответ - да.

Краткий ответ:

Relation::$morphMap

возвращает все сопоставления в виде массива.

И мое решение вопроса:

$model = Relation::$morphMap[$request->commentable_model]::findOrFail($request->commentable_id);

Доступ к этому значению массива с использованием нашего заданного имени морфа (которое является блогом).

...