我有一个模型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;
但这给了我错误:
“ where子句”中的未知列“ images.foo_id”(SQL:从
images
中选择*,其中images
。foo_id
= 1和images
。{{1 }}不能为空限制1)“
答案 0 :(得分:4)
你们两个人的关系都是错误的。这种关系是一对多的。您在Foo中定义了一对一,在Image中定义了多对多。
答案 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
,在图像上使用hasOne
或hasMany
...
或以其他方式重新声明您的迁移表
模型Foo
,两个字段id
,title
。 foo_id
表上的image
引用了id
表上的foo
。
答案 3 :(得分:0)
将您的模型更改为此... 图像模型应具有这些列'foo_id'和'image_path'。
在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;
}