【问题标题】:Laravel Eloquent ORM One-to-Many Relationship, Select from two TablesLaravel Eloquent ORM 一对多关系,从两个表中选择
【发布时间】:2020-11-08 03:30:01
【问题描述】:

我有两个网店的mySQL表:

产品(列:id 等...)

图片(列:id、product_id、文件路径等...)

products-table 的任何 product 可能有无限数量的 图片

因此,我的产品模型如下所示:

class Product extends Model
{
    public function pictures()
    {
        return $this->hasMany('App\Picture');
    }
}

我的图片模型是这样的:

class Picture extends Model
{
    //
}

现在,我正在尝试列出所有产品一起及其相应的图片数据集。我尝试运行多个代码。但是,以下代码均无效:

\App\Product::pictures()->get()

不起作用!显示此错误:

Non-static method App\Product::pictures() should not be called statically

我也尝试了一些其他的方法,例如

\App\Product::with('pictures')->get());

错误:

Trying to get property 'filepath' of non-object (View: /home/vagrant/testproject/resources/views/products.blade.php)

备注:文件路径是一列图片。我正在尝试像这样在刀片中访问它:

{{$products->picture->filepath}}

我现在在这个小东西上工作了几个小时 - 但我就是不明白我做错了什么?非常感谢任何帮助!谢谢各位!

【问题讨论】:

    标签: php mysql laravel


    【解决方案1】:

    你正在做的事情有两个潜在的问题。

    1. 您正在使用{{$products->picture->filepath}},所以我假设您正在执行以下操作:

    $products = \App\Product::with('pictures')->get());

    这里的$productsProduct 模型的集合。该集合没有picture 属性。

    1. 您正在循环访问类似的产品
    @foreach($products as $product)
        {{$product->picture->filepath}}
    @endforeach
    

    除非每个产品都有图片,否则这可能会导致您所说的错误。如果产品没有图片,那么您将调用 null 文件路径。您可以通过多种方式解决此问题,我将在下面列出一种:

    @foreach($products as $product)
        @if(!empty($product->picture))
            {{$product->picture->filepath}}
        @endif
    @endforeach
    

    正如 OP 在 cmets 下面指出的根本问题是关系有很多。所以要使用图片,你应该这样做:

    @foreach($products as $product)
        @foreach($product->pictures as $picture)
            {{$picture->filepath}}
        @endforeach
    @endforeach
    

    【讨论】:

    • 感谢您的快速回答!我的主要问题仍未解决!我的目标是拥有一个数组/集合,其中列出了所有产品及其相应的图片! product1=>pic1,pic2,pic3 - product2=> pic4,pic5,pic6... 但是图片甚至没有从数据库中选择!我想知道我对关系的定义或理解是否有错误?
    • @Chris 请在回答中添加dd(\App\Product::with('pictures')->get()));
    • 亲爱的库尔特,非常感谢!您的代码 sn-p 帮助我找到了问题!在测试环境中,我试图访问第一张图片,如$product->picture->filepath。但!哦,哈哈...每个产品当然可以有很多图片!因此,有必要使用 foreach 或其他方式访问它们 - 即使该产品只有一张图片可用:foreach ($product->picture as $p) { $p->filepath } :D 非常感谢您的帮助!
    • @Chris 干得好,我会更新我的答案,因为我也以某种方式错过了 hasMany 关系。
    猜你喜欢
    • 1970-01-01
    • 2014-12-14
    • 2014-05-16
    • 2013-04-03
    • 2018-12-29
    • 2016-02-11
    • 1970-01-01
    • 2015-04-16
    • 2013-02-09
    相关资源
    最近更新 更多