首页 > 解决方案 > 在 Laravel 中合并两个集合并访问它

问题描述

好的,这是我的问题:我还没有找到一个合适的解决方案来“合并”(不确定它是否是正确的词)laravel 中的两个集合。我将向您展示我的代码,它会自行解释。

所以这是我蹩脚的方式代码,但我很确定有更好的方法来做到这一点:

这是我的控制器:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Product;
use App\ProductPhoto;

class ProductController extends Controller
{
    public function index() {
        $products = Product::all();
        $photos = ProductPhoto::all();

        return view('/products')->with([
            'products' => $products,
            'photos' => $photos
        ]);
    }
}

我的观点是这样的;

@foreach($products as $product)
    @foreach($photos as $photo)
        @if($photo->product_id = $product->id)
            <img src="/products/{{ $product->id }}/{{ $photo->filename }}">
        @endif
    @endforeach
@endforeach

但我想在产品集合中包含与产品相关的所有照片。我想有一个简单的观点:

@foreach($products as $product)
    @foreach($product->photos as $photo)
        <img src="/products/{{ $product->id }}/{{ $photo->filename }}"
    @endforeach
@endforeach

或者比这更简单的另一种方式。我一直在尝试合并,但我不认为这是我需要的,我不知道。或者也许我这样做的方式是正确的,但我对此表示怀疑。

谢谢阅读 !

标签: laravelcollectionsmerge

解决方案


我建议为此使用雄辩的关系。为此,您需要在名为 的产品类上创建关系photos。这看起来像这样:

class Product extends Model
{
    ...
    public function photos()
    {
        return $this->hasMany(ProductPhoto::class);
    }
    ...
}

完成此操作后,您可以更新控制器,因为您不再需要从模型中获取照片。为了提高性能,您可以急切地加载照片。

public function index() {
    $products = Product::with('photos')->get();

    return view('/products')->with([
       'products' => $products
    ]);
}

最后,您可以更新视图以使用photos关系。

@foreach($products as $product)
    @foreach($product->photos as $photo)
        <img src="/products/{{ $product->id }}/{{ $photo->filename }}"
    @endforeach
@endforeach

我希望这会有所帮助。


推荐阅读