Доступ к атрибутам сводных таблиц polymorphi c в laravel 6 - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь использовать полиморф c много ко многим отношениям. У меня есть изображения, которые могут быть связаны с несколькими различными типами моделей. Каждая модель может иметь более одного изображения, но может иметь только одно изображение по умолчанию (эскиз). Я думал, что смогу добиться этого, добавив столбец в сводную таблицу следующим образом:

Schema::create('image_links', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->unsignedBigInteger('image_id');
        $table->unsignedBigInteger('image_links_id');
        $table->string('image_links_type');
        $table->boolean('default_image');
    });

Я определил отношения следующим образом:

Изображение:

public function model1()
{
    return $this->morphedByMany('App\Model1', 'image_links')->withPivot('default_image');
}

Modal1:

public function image()
{
    return $this->morphToMany('App\Image', 'image_links')->withPivot('default_image');
}

В контроллере Model1 я просматриваю etch Madel1 следующим образом:

$user = User::find(auth()->user()->id);

    foreach ($user->modal1as $model1) {

        $images = Image::find($model1->id);

        if (!empty($images)) {
            $model1->image = Image::find($model1->id);

            dd($model1);
        }

В результате проведенного мной исследования я ожидаю доступ к столбцу default_image, как этот :

$model1->default_image

Но когда я это сделал, получилось NULL. Мне нужно иметь возможность искать в базе данных и получать только изображение с default_image, установленным как 1.

Я думал, что это возможно, но я не могу заставить его работать.

Я пробовал это так:

$image = Image::find($model1->id)->where('default_image = 1');
            // $images = Image::get();

            dd($image);

Это возвращает:

   Illuminate\Database\Eloquent\Builder {#302 ▼
  #query: Illuminate\Database\Query\Builder {#298 ▶}
  #model: App\Image {#317 ▶}
  #eagerLoad: []
  #localMacros: []
  #onDelete: null
  #passthru: array:17 [▶]
  #scopes: []
  #removedScopes: []
}

Я не вижу, как получить доступ к деталям изображения.

Редактировать:

Вот некоторые другие вещи, которые я сейчас попробовал.

Я в контроллере model1 и хочу получить изображения, связанные с model1, которые имеют значение default_image, равное 1. Не думаю, что я правильно запрашиваю базу данных в первом случае. Я понял, что

$images = Image::find($model1->id);

извлекает изображение с тем же идентификатором у текущей модели1. Ведьма неверна. Я попытался

$images = App\Image::whereHasMorph( 'image_links', ['App\Model1'], function (Builder $query) { $query->where('id', 'like', $GLOBALS['id']); } )->get();

, который возвратил класс 'App \ Http \ Controllers \ App \ Image' не найден. Я посмотрел приложение \ и добавил использование App \ Image и получил вызов неопределенный метод App \ Image :: image_links (). Я теперь действительно потерян с этим муравьем, нуждающимся в помощи.

14/04/2020 Update.

Теперь я изменил image_links на imageables. Однако это все еще не сработало. Я пытался получить доступ к изображениям следующим образом:

use App\Model1

$modal1 = Model1::get();
return $model1->images;

Это дает мне эту ошибку: Свойство [images] не существует в этом экземпляре коллекции.

Пожалуйста, кто-то может помочь с этим?

Другая информация: я запускаю WAMP на Windows 10

...