模型关联(三张表关联的问题)

首先介绍一下表结构

goods表(商品表)

id name price
1 商品 100
2 商品1 100
3 商品2 100

goods_category表(中间表)

id goods_id category_id
1 1 1

category_id表 (分类表)

id name sort
1 水果 1
2 衣服 2

业务是做一个商品列表,每个商品要展示它所属的分类,以及根据分类筛选商品。
从表的关系来看,goods为主表关联goods_category表再关联,得到的结果应该是三条数据,其中两条的所属分类为空。

在我使用模型关联的多对多关联后,最终得到的数据和我预期的不太一样。

关联代码

 public function categoryRelation()
    {
        return $this->belongsToMany('App\Models\CategoryModel', 'goods_category', 'goods_id', 'category_id');
    }

执行代码

DB::enableQueryLog();
    $result = \App\Models\GoodsModel::with('categoryRelation')->whereHas("categoryRelation", function ($query) {

    })->get();
dd(DB::getQueryLog());
var_dump($result->toArray());

最终结果

array(2) {
  [0]=>
  array(3) {
    ["id"]=>
    int(30)
    ["name"]=>
    string(14) "测试商品28"
    ["category_relation"]=>
    array(1) {
      [0]=>
      array(7) {
        ["id"]=>
        int(3)
        ["name"]=>
        string(6) "衣服"
        ["sort"]=>2
        ["pivot"]=>
        array(2) {
          ["goods_id"]=>
          int(30)
          ["category_id"]=>
          int(3)
        }
      }
    }
  }
  [1]=>
  array(3) {
    ["id"]=>
    int(137)
    ["name"]=>
    string(6) "水果"
    ["category_relation"]=>
    array(1) {
      [0]=>
      array(7) {
        ["id"]=>
        int(3)
        ["name"]=>
        string(6) "衣服"
        ["sort"]=>1
        ["pivot"]=>
        array(2) {
          ["goods_id"]=>
          int(137)
          ["category_id"]=>
          int(3)
        }
      }
    }
  }
}

打印的sql

array:2 [
  0 => array:3 [
    "query" => "select * from `goods` where exists (select * from `category` inner join `goods_category` on `category`.`id` = `goods_category`.`category_id` where `goods`.`id` = `goods_category`.`goods_id`)"
    "bindings" => []
    "time" => 67.31
  ]
  1 => array:3 [
    "query" => "select `category`.*, `goods_category`.`goods_id` as `pivot_goods_id`, `goods_category`.`category_id` as `pivot_category_id` from `category` inner join `goods_category` on `category`.`id` = `goods_category`.`category_id` where `goods_category`.`goods_id` in (?, ?)"
    "bindings" => array:2 [
      0 => 30
      1 => 137
    ]
    "time" => 14.08
  ]
]

有点不太懂,希望大家能给我一下指导,谢谢大家!

DaiChongWeb
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

解决了,我沙雕了

    $result = \App\Models\GoodsModel::with("categoryRelation")->get();

这样写就对了!

4年前 评论
讨论数量: 2

解决了,我沙雕了

    $result = \App\Models\GoodsModel::with("categoryRelation")->get();

这样写就对了!

4年前 评论

分类与商品不是一对多的关系么?

商品表加 category_id 外键就可以了吧 貌似不需要中间表

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!