Laravel 5中关联表打印数据时关联内容重复问题咨询
解决Laravel套餐与课程关联显示错误的问题
嘿,我一眼就看出问题出在哪了——你现在是把所有套餐和所有关联课程分别查出来,但没把每个套餐和它对应的课程绑定到一起,所以每个套餐都遍历了全部课程集合,自然就显示所有课程啦。下面给你两种靠谱的解决方案:
方案一:用Eloquent关联(推荐,最符合Laravel规范)
首先在Package模型里定义与Course的多对多关联,记得指定中间表和外键(因为你的字段是驼峰命名,和Laravel默认的蛇形命名不一致):
// app/Models/Package.php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Package extends Model { // 如果你的表名不是复数,需要指定表名 // protected $table = 'package'; public function courses() { // 参数依次是:关联模型,中间表名,当前模型在中间表的外键,关联模型在中间表的外键 return $this->belongsToMany(Course::class, 'course_package', 'Package_Id', 'Course_Id'); } }
然后在控制器里用with()预加载关联数据(避免N+1查询问题):
public function index() { // 预加载每个套餐对应的课程 $packages = Package::with('courses')->get(); // 把数据传给视图 return view('你的视图名称', compact('packages')); }
最后在视图里循环套餐和对应的课程:
@foreach($packages as $package) <h3>套餐:{{ $package->你的套餐名称字段 }}</h3> <ul> @foreach($package->courses as $course) <li>课程:{{ $course->你的课程名称字段 }}</li> @endforeach </ul> @endforeach
方案二:用DB查询构造器(不推荐,会有N+1问题)
如果你暂时不想用Eloquent关联,也可以在遍历套餐的时候,为每个套餐单独查询对应的课程:
public function index() { $packages = Package::all(); // 遍历每个套餐,查询它对应的课程 foreach ($packages as $package) { $package->courses = DB::table('course_package') ->join('course', 'course_package.Course_Id', '=', 'course.Id') ->where('course_package.Package_Id', $package->Id) // 关键:按当前套餐ID过滤 ->get(); } return view('你的视图名称', compact('packages')); }
视图里的写法和方案一一样就行。
为什么原来的代码会出错?
你原来的代码是单独查询了所有套餐和所有关联的课程(不分套餐),然后在视图里每个套餐都循环这个全局的课程集合,自然每个套餐都会显示所有课程啦。核心问题就是没有给每个套餐过滤对应的课程数据~
内容的提问来源于stack exchange,提问作者Znowman




