У меня есть модель Foo
, в которой есть три поля: id
, title
и image_id
. image_id
ссылается на id
в таблице images
.
У меня отношения настроены так:
< Сильный > foo.php :
public function image()
{
return $this->hasOne('App\Image');
}
< Сильный > image.php :
public function foos()
{
return $this->belongsToMany('App\Foo');
}
Я думал, что смогу получить изображение Foo с этим:
$foo = Foo::find(1);
$image = $foo->image;
Но это дает мне ошибку:
Неизвестный столбец 'images.foo_id' в 'предложении where' (SQL: выберите * из
images
, гдеimages
.foo_id
= 1 иimages
.foo_id
не нулевой лимит 1)
4 ответа
Оба ваших отношения неправильны. Отношения один-ко-многим. У вас есть один к одному, определенный в Foo, и множество ко многим, определенный в Image.
- Foo принадлежит одному изображению, так что это будет принадлежать отношение.
- У изображений может быть много foos, так что это будет отношение hasMany.
Ваши отношения не установлены правильно.
Когда вы храните внешний ключ в таблице, это дочерний ключ. В этом случае Foo
имеет Image
, но Image
может использоваться в одном или нескольких Foo
с, поэтому:
Image 1 ---- m Foo
// or if the image is unique for every Foo object
Image 1 ---- 1 Foo
Это означает:
Foo.php
public function image()
{
return $this->belongsTo('App\Image');
}
Image.php
public function foos()
{
return $this->hasMany('App\Foo');
// or if its unique:
// return $this->hasOne('App\Foo');
}
Да ... Соотношение hasOne
делает это ... ищет foo_id
в вашей таблице image
.
Вы должны использовать belongsTo
на Foo
и hasOne
или hasMany
на изображении ...
Или переопределите ваши таблицы миграции ... другим способом
Модель, Foo
, два поля, id
, title
. И foo_id
в таблице image
ссылается на id
таблицы foo
.
Измените ваши модели на это ... Модель изображения должна иметь эти столбцы 'foo_id', 'image_path'.
И удалите столбец image_id из вашей модели Foo.
Внутри функции создания в Foocontroller ...
$foo = new Foo();
$foo->title = $request->title;
$foo->save();
$pathToImage = Storage::put('images/',$request- >file('image'));
$image = new Image();
$image->image_path = $pathToImage;
$image->foo_id = $foo->id;
$image->save();
Внутри модели Foo ...
public function image()
{
return $this->hasOne('App\Image');
}
Внутри модели Image ...
public function foo()
{
return $this->belongsTo('App\Foo');
}
Выборка вашего элемента foo из базы данных
$foos = Foo::all();
foreach ($foos as $foo){
echo $foo->title;
echo $foo->image->image_path;
}
Похожие вопросы
Новые вопросы
php
PHP является широко используемым, высокоуровневым, динамическим, объектно-ориентированным и интерпретируемым языком сценариев, в первую очередь предназначенным для серверной веб-разработки. Используется для вопросов о языке PHP.