Я пытаюсь использовать полиморф 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