Laravel5:能否在HasManyThrough中使用中间表而非模型?
嘿,这个问题我之前也研究过,Laravel的hasManyThrough关联确实有它的规则,咱们一步步说清楚:
关于Laravel 5中
hasManyThrough使用中间表的问题 1. 能不能直接传入数据库表名作为第二个参数?
答案是不行。hasManyThrough方法的第二个参数要求传入的是关联模型的类路径/别名,而不是数据库表名。Laravel的关联系统是围绕模型设计的,它需要通过模型来获取表名、字段映射、关联逻辑等核心信息,直接传表名的话框架无法识别对应的关联规则,会直接抛出错误。
比如你期望的写法:
return $this->hasManyThrough( 'App\Post', 'database.table', // 这里不能直接传表名 'country_id', 'user_id', 'id', 'id' );
这种写法会触发类加载错误,因为框架会尝试去实例化名为database.table的模型类,显然这并不存在。
2. 能否用一个模型加中间表实现HasManyThrough关联?
严格来说,hasManyThrough的设计逻辑就是需要三个实体:主模型、中间模型、目标模型。所以如果想使用这个官方关联方法,必须要有中间模型的存在。
不过如果实在不想创建额外的中间模型,你可以通过自定义查询的方式实现类似的关联效果,比如直接用join语句拼接查询:
// 假设主模型是Country,中间表是users,目标模型是Post public function posts() { return Post::join('users', 'users.id', '=', 'posts.user_id') ->where('users.country_id', $this->id) ->select('posts.*'); }
调用$country->posts()就能得到对应的关联数据,虽然不是严格意义上的hasManyThrough关联,但实现了相同的查询结果。
不过还是建议遵循Laravel的Eloquent规范来做——如果中间表对应的模型本来就存在(比如示例中的users表对应User模型),直接用它就好:
// 在Country模型中定义关联 public function posts() { return $this->hasManyThrough( App\Post::class, App\User::class, 'country_id', // User表中关联Country的字段 'user_id', // Post表中关联User的字段 'id', // Country表的主键 'id' // User表的主键 ); }
这种方式更符合框架的设计理念,还能享受到关联模型带来的预加载、链式查询等便利特性。
内容的提问来源于stack exchange,提问作者Dong3000
相关产品推荐
相关产品推荐

