Laravel中关联多表,实现产品与多图片嵌套结构查询
实现产品与嵌套图片数组的查询方案
方法一:使用Eloquent关联(推荐)
这种方式符合Laravel的最佳实践,同时能避免N+1查询问题。
定义模型关联
在Product模型中添加关联方法:namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; class Product extends Model { public function images(): HasMany { return $this->hasMany(ProductImage::class, 'product_id'); } }对应的
ProductImage模型(若未创建):namespace App\Models; use Illuminate\Database\Eloquent\Model; class ProductImage extends Model { protected $table = 'product_images'; // 若表无时间戳字段,可添加:public $timestamps = false; }查询数据
使用with预加载关联图片,直接生成嵌套结构:return App\Models\Product::with('images')->get();返回结果会自动包含嵌套的
images数组,完全符合你预期的数据格式。
方法二:使用查询构造器手动处理
若不想依赖Eloquent模型,可通过以下两种方式实现:
方式1:循环查询(简单直接)
$products = DB::table('products')->get(); foreach ($products as $product) { $product->images = DB::table('product_images') ->where('product_id', $product->id) ->select('id', 'image_url') ->get(); } return $products;
方式2:聚合函数+JSON处理(单次查询)
依赖数据库的JSON函数支持(如MySQL 5.7+):
$products = DB::table('products') ->leftJoin('product_images', 'products.id', '=', 'product_images.product_id') ->select( 'products.id', 'products.name', 'products.price', DB::raw('JSON_ARRAYAGG(JSON_OBJECT("id", product_images.id, "image_url", product_images.image_url)) as images') ) ->groupBy('products.id', 'products.name', 'products.price') ->get(); return $products;
内容的提问来源于stack exchange,提问作者Mishen Thakshana
相关产品推荐
相关产品推荐

