【问题标题】:Eloquent relationship confusion雄辩的关系混乱
【发布时间】:2023-03-16 19:15:02
【问题描述】:

我有一个模型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: select * from images where images.foo_id = 1 and images.foo_id is not null limit 1)"

【问题讨论】:

  • 请在下面尝试我的答案)))

标签: php laravel eloquent relationship


【解决方案1】:

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

  1. Foo 属于一个图像,所以这将是一个 belongsTo 关系。
  2. 图像可以有很多 foo,所以这将是一个 hasMany 关系。

【讨论】:

  • 一切正常,但是如果您将唯一性添加到 image_id,它将转换为 hasOne。他没这么说,但不一定是hasMany
  • 你是对的,但我认为通过在 Image 上使用 belongsToMany 来假设一对多是安全的。
  • 是的,我认为它是 hasOne,因为他说“我想我可以用这个获得 Foo 的图像”......哈哈! GluePear 如果您想获得直接对象,请使用 hasOne,但正如它所说,只会返回一个...如果您想要迭代多个图像,请使用 Devon 所说的
  • 好吧,hasOne 将在 Image 上,而不是 Foo,因为 image_id 位于 foos 表中。所以它仍然是 belongsTo 并且能够使用上述关系获得 Foo 的单个图像。 (一对一和一对多不影响 Foo::image 关系)
  • 哦,你是对的,image_id 是可以在许多 foo 中的,我的错。所以 with 会倒退...如果您想要 FOO 的直接对象,请使用 hasOne... 等...
【解决方案2】:

你们的关系设置不正确。

当您将外键存储在表中时,这是子表。在这种情况下,Foo 有一个 Image,但一个 Image 可以在一个或多个 Foos 中使用,所以:

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

【讨论】:

  • 正如我在另一个答案中指出的那样:一切正常,但是如果您将唯一性添加到 image_id,它会转换为 hasOne。他没这么说,但不一定是hasMany
  • 是的,很好的观察。
【解决方案3】:

是的...hasOne 关系可以...在您的 image 表中查找 foo_id

您应该在FoohasOne 上使用belongsTo 或在图像上使用hasMany...

或者重新声明你的迁移表……换一种方式

一个模型,Foo,两个字段,idtitle。并且image 表上的foo_id 引用foo 表上的id

【讨论】:

    【解决方案4】:

    把你的模型改成这个... 图像模型应该有这些列 '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;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-03-05
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 2014-08-27
      • 2015-03-14
      相关资源
      最近更新 更多