php - laravel belongsToMany,多对多查询问题
大家讲道理
大家讲道理 2017-04-11 09:40:45
[PHP讨论组]

现在用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

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

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(1)
怪我咯

主键写反了

应该写成:

 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语句是什么样的,就能很快定位问题了。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号