###

今天在连表获取数据的时候,老是获取不到想要的,确实有点无力适从的感觉。

归根到底,还是对laravel不够熟悉,至少是数据库操作那块。

###

问题是这样的:

    我想要通过连表中间表,拿中间表的id。但是product 在关联的中间表中有多个,需要brandId,categoryId去限制获取,然后就可以获取到,但是我实际操作的时候却不是想要的结果。

获取的是categoryId=50 ,brand_id=1 的所有商品,还有需要中间表的id

  1. array:10 [0 => array:21 ["id" => 323
  2. "name" => ""
  3. "snumber" => ""
  4. "number" => 0
  5. "product_categories" =>
  1. 0 => array:6 [
  2. "id" => 20
  3. "product_id" => 323
  4. "category_id" => 2
  5. "brand_id" => 1
  6. "created_at" => "2017-04-17 13:16:42"
  7. "updated_at" => "2017-04-17 13:16:42"
  8. ]
  9. 1 => array:6 [
  10. "id" => 458
  11. "product_id" => 323
  12. "category_id" => 1
  13. "brand_id" => 1
  14. "created_at" => "2017-04-17 15:40:34"
  15. "updated_at" => "2017-04-17 15:40:34"
  16. ]
  17. 2 => array:6 [
  18. "id" => 758
  19. "product_id" => 323
  20. "category_id" => 50
  21. "brand_id" => 1
  22. "created_at" => "2017-04-17 17:21:30"
  23. "updated_at" => "2017-04-17 17:21:30"
  24. ]
  25. 3 => array:6 [
  26. "id" => 991
  27. "product_id" => 323
  28. "category_id" => 47
  29. "brand_id" => 1
  30. "created_at" => null
  31. "updated_at" => null
  32. ]
  33. ]
  1. ] 1 => array:21 [] 2 => array:21 [] 3 => array:21 [] 4 => array:21 [] 5 => array:21 [] 6 => array:21 [] 7 => array:21 [] 8 => array:21 [] 9 => array:21 [] ]

我只想要的是product_categories 中的第2个数组就行

方法是:

  1. $productIds = ProductCategories::where('category_id', $categoryId)
  2. ->where('brand_id', $brandId)
  3. ->pluck('product_id', 'id')
  4. ->all();
  5.  
  6. $products = Product::whereIn('id', $productIds)
  7. ->with('productCategories')
  8. ->whereHas('productCategories', function ($q1) use ($categoryId, $brandId) {
  9. return $q1->where(['brand_id' => $brandId,'category_id' => $categoryId]);
  10. })
  11. ->get();

发现这样操作并不行。。。

搞好久还是老实的去看文档

  1. $productIds = ProductCategories::where('category_id', $categoryId)
  2. ->where('brand_id', $brandId)
  3. ->pluck('product_id', 'id')
  4. ->all();
  5. $products = Product::whereIn('id', $productIds)
  6. ->with(['productCategories' => function ($q1) use ($categoryId, $brandId){
  7. $q1->where(['brand_id' => $brandId ,'category_id' => $categoryId]);
  8. }])
  9. ->get();

结果就可以了:

  1. array:10 [
  2. 0 => array:21 [
  3. "id" => 323
  4. "name" => ""
  5. "snumber" => ""
  6. "number" => 0
  1. "product_categories" => array:1 [
  2. 0 => array:6 [
  3. "id" => 758
  4. "product_id" => 323
  5. "category_id" => 50
  6. "brand_id" =>
  7. "created_at" => "2017-04-17 17:21:30"
  8. "updated_at" => "2017-04-17 17:21:30"
  9. ]
  10. ]
  11. ]

Laravel 5.2数据库--多个关联关系,带条件约束的渴求式加载的问题的更多相关文章

  1. Laravel渴求式加载(比较容易理解理解load与with关系)

    渴求式加载 当以属性方式访问 Eloquent关联关系的时候,关联关系数据是「懒惰式加载」的,这意味着关联关系数据直到第一次访问的时候才被加载.不过,Eloquent 还可以在查询父级模型的同时「渴求 ...

  2. laravel 嵌套的渴求式加载

    今天在通过需求表A查询场地类型表B,然后通过表B的场地类型id去查询表C场地类型名的时候遇到了一个小的问题. 需求表A的字段:id.user_id .name等等: 中间表B的字段:id.appeal ...

  3. laravel with嵌套的渴求式加载

    今天在通过需求表A查询场地类型表B,然后通过表B的场地类型id去查询表C场地类型名的时候遇到了一个小的问题. 需求表A的字段:id.user_id .name等等: 中间表B的字段:id.appeal ...

  4. laravel with 渴求式加载指定字段

    在使用 Laravel 的关联查询中,我们经常使用 with 方法来避免 N+1 查询,但是 with 会将目标关联的所有字段全部查询出来,对于有强迫症的我们来说,当然是不允许的. 这时候我们可以使用 ...

  5. 页面ajax自带的访问后台时,正在加载中

    ajax自带访问后台时,提示正在加载中,加载完成后自动消除遮罩层,代码如下: var mask=mui.createMask();//遮罩层 //传统ajax的post请求方式 mui.ajax('h ...

  6. 带你剖析WebGis的世界奥秘----瓦片式加载地图(转)

    带你剖析WebGis的世界奥秘----瓦片式加载地图 转:https://zxhtom.oschina.io/zxh/20160805.html  编程  java  2016/08/05 0留言,  ...

  7. 提取数据库字段里面的值,并改变+图片懒加载,jquery延迟加载

    要求:手机端打开某个页面的详细信息,因为网速或者别的原因,响应太慢,因为图片大的原因,希望先进来,图片在网页运行的情况再慢慢加载(jquer延迟加载) http://www.w3cways.com/1 ...

  8. 带你剖析WebGis的世界奥秘----瓦片式加载地图

    WebGIS应用程序的页面能够通过HTML.JSP.ASP或任何任何类型的Web页文件构成,其特殊之处在于,它的请求提交的方法并不是通过常用的 "超链接"形式,而是使用鼠标与Web ...

  9. EularProject 43: 带条件约束的排列组合挑选问题

    Sub-string divisibility Problem 43 The number, 1406357289, is a 0 to 9 pandigital number because it ...

随机推荐

  1. functools学习记录

    装饰器demo def wrapper(func): print('装饰器工作了') def inner(*args,**kwargs): return func(*args,**kwargs) re ...

  2. 信号量Semaphore

    信号量说简单点就是为了线程同步,或者说是为了限制线程能运行的数量. 那它又是怎么限制线程的数量的哩?是因为它内部有个计数器,比如你想限制最多5个线程运行,那么这个计数器的值就会被设置成5,如果一个线程 ...

  3. 二十六、Linux 进程与信号---system 函数 和进程状态切换

    26.1 system 函数 26.1.1 函数说明 system(执行shell 命令)相关函数 fork,execve,waitpid,popen #include <stdlib.h> ...

  4. 修改教材P74 一行代码 NineNineTable.java, 让执行结果是个三角形

    修改教材P74 一行代码 NineNineTable.java, 让执行结果是个三角形: 提交在IDEA或命令行中运行结查截图,加上学号水印,没学号的不给成绩 2*9=18 3*9=27 4*9=36 ...

  5. Oracle DbHelper

    wind8 系统选择项目时生成目标平台选择为X86 报错 “System.Exception”类型的未经处理的异常在 WindowsFormsApplication1.exe 中发生 其他信息: 尝试 ...

  6. 第26月第23天 nsobject 单例 CFAbsoluteTimeGetCurrent

    1.nsobject 单例 sudo chmod 666 /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources/ ...

  7. bebugger调试理解commonJS原理

    上面图片是bebugger一个导入的模块,使用vscode可以轻松的看到调用栈,通过断点调试进入断点 Mode函数的原型里面有一个require方法,函数里面有Module._load()加载模块,传 ...

  8. MySQL - GROUP BY和HAVING的用法

    按姓名分组查询 SELECT username, COUNT(username) AS '人数' FROM t_user GROUP BY username 只查询姓名相同的人 SELECT user ...

  9. 【提示框】【计时事件】【cookie】

    1.提示框 1)警告框 <script>function disp_alert(){alert("我是警告框!!")}</script> 2)确认框 fun ...

  10. Ubuntu16.04安装最新版nodejs

    原文链接:https://www.jianshu.com/p/2b24cd430a7d