laravel belongsToMany,多对多查询问题

现在用laravel 5.3 的 belongsToMany,总感觉有点奇怪,多对多查出来只有一条记录,下面贴代码。

  1. PackageIndex

    id
    name
    etc...
  2. PackageProject

    id
    name
    etc...
  3. PackageProjectIndex

    package_id
    project_id
    

    在PacakgeIndex中.

 public function projects(){
    return $this->belongsToMany('PackageProject','package_project_index','package_id','project_id');      
 }

attach和detach都没问题, 如

PackageIndex::first()->attach([1,2,3]);

但是管理查询的时候 , 不管project有多少个,

PackageIndex::first()->projects

出来的始终只有一个。求助!

阅读 9.6k
2 个回答

主键写反了

clipboard.png

应该写成:

 public function projects(){
    return $this->belongsToMany('PackageProject','package_project_index','project_id','pacakge_id');      
 }

参见: 多对多


题主没看懂,我再解释一下问题出在哪

我们假设a、b两个表,表名为as、bs,主键分别为a_id、b_id,中间表为a_b(a_id,b_id);

那么根据官方给出的例子,应该写成:

Model:A

public function bs(){
    return $this->belongsToMany('App\B', 'a_b', 'a_id', 'b_id');
}

注意看第一个参数和第四个参数的对应关系。第三个参数应该为本Model的主键,第四个参数应该为第一个参数Model的主键。 顺序绝对不能反。而题主的问题就是这两个参数理解反了。

至于题主在评论里说改过来了就一个结果都没有了,那恰恰说明了你已经看到了错误,而不是继续在错误的路上行走。

建议测试时将a、b表测试数据主键设置为不重复的。不然a_id也是1、2、3,b_id也是1、2、3,中间表一看,你自己根本搞不清哪个是哪个。attach的时候就关联错了,后面获取更是一团糟,云里雾里分不清id是a还是b了。

另外建议开启mysql查询日志,对照日志查看sql语句是什么样的,就能很快定位问题了。

新手上路,请多包涵

::first() 改成::get() 就有多个了吧

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题