Laravel 7.4:如何用Eloquent判断报表是否关联应用?
问题解决方法
错误原因
你用$report->applications->has($report->id)的写法完全错误:
$report->applications返回的是Eloquent集合,集合的has()方法是用来检查集合中是否存在指定键名的元素,不是用来判断关联ID的。- 你实际要判断的是当前报表是否关联了至少一个应用,这个方法逻辑完全不匹配。
正确实现方式
方式一:数据库层面直接筛选(推荐,性能最优)
如果要直接获取所有关联了应用的报表,直接在查询时用Eloquent的has()方法(这是查询构造器的方法,不是集合方法):
// ReportsController@getReports public function getReports() { // 获取所有关联了至少一个应用的报表 $reports = Report::has('applications')->get(); // 后续逻辑 return view('reports.index', compact('reports')); }
方式二:集合层面判断单个报表是否有应用关联
如果已经加载了报表集合,要逐个判断报表是否有应用关联,用以下两种方法:
- 检查预加载的集合是否非空(适合已经预加载
applications关联的场景):
foreach ($reports as $report) { if ($report->applications->isNotEmpty()) { // 该报表有关联应用 } }
- 直接查询数据库判断关联是否存在(适合未预加载关联的场景,不会加载整个关联集合):
foreach ($reports as $report) { if ($report->applications()->exists()) { // 该报表有关联应用 } }
额外优化建议
你的中间表applicationReports目前没有主键和联合唯一索引,可能会出现重复的关联记录,建议在迁移中添加:
// 修改applicationReports表的迁移up方法 public function up() { Schema::create('applicationReports', function (Blueprint $table) { $table->unsignedInteger('application_id')->nullable(false); $table->unsignedInteger('report_id')->nullable(false); // 添加联合主键,避免重复关联 $table->primary(['application_id', 'report_id']); }); }
执行迁移更新后,能保证同一个应用和报表不会被重复关联,同时也能提升关联查询的性能。
内容的提问来源于stack exchange,提问作者Tlat
相关产品推荐
相关产品推荐

