雄辩的关系混乱

时间:2018-08-21 15:57:28

标签: php laravel eloquent relationship

我有一个模型Foo,其中有三个字段idtitleimage_idimage_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;

但这给了我错误:

  

“ where子句”中的未知列“ images.foo_id”(SQL:从images中选择*,其中imagesfoo_id = 1和images。{{1 }}不能为空限制1)“

4 个答案:

答案 0 :(得分:4)

你们两个人的关系都是错误的。这种关系是一对多的。您在Foo中定义了一对一,在Image中定义了多对多。

  1. Foo属于一个图像,因此应该是一个belongsTo关系。
  2. 图像可能有很多foo,因此这将是hasMany关系。

答案 1 :(得分:2)

您的关系设置不正确。

将外键存储在表中时,这就是子键。在这种情况下,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 :(得分:0)

是的... hasOne关系可以做到...在您的foo_id表上寻找image

您应该在belongsTo上使用Foo,在图像上使用hasOnehasMany ...

或以其他方式重新声明您的迁移表

模型Foo,两个字段idtitlefoo_id表上的image引用了id表上的foo

答案 3 :(得分:0)

将您的模型更改为此... 图像模型应具有这些列'foo_id'和'image_path'。

并从Foo模型中删除“ image_id”列。

在Foocontroller中的create函数中...

$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');
}

在图像模型中...

public function foo()
{
    return $this->belongsTo('App\Foo');
}

从数据库中获取您的foo项

$foos = Foo::all();
foreach ($foos as $foo){
       echo  $foo->title;
       echo  $foo->image->image_path;
}