You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动