У меня есть модель 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)

0
GluePear 21 Авг 2018 в 18:57

4 ответа

Лучший ответ

Оба ваших отношения неправильны. Отношения один-ко-многим. У вас есть один к одному, определенный в Foo, и множество ко многим, определенный в Image.

  1. Foo принадлежит одному изображению, так что это будет принадлежать отношение.
  2. У изображений может быть много foos, так что это будет отношение hasMany.
4
Devon 21 Авг 2018 в 16:09

Ваши отношения не установлены правильно.

Когда вы храните внешний ключ в таблице, это дочерний ключ. В этом случае 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');
}
2
Kenny Horna 21 Авг 2018 в 16:23

Да ... Соотношение hasOne делает это ... ищет foo_id в вашей таблице image.

Вы должны использовать belongsTo на Foo и hasOne или hasMany на изображении ...

Или переопределите ваши таблицы миграции ... другим способом

Модель, Foo, два поля, id, title. И foo_id в таблице image ссылается на id таблицы foo.

0
Erubiel 21 Авг 2018 в 16:27

Измените ваши модели на это ... Модель изображения должна иметь эти столбцы '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;
}
0
Akbar Mirsiddikov 22 Авг 2018 в 02:20
51952567