关于 Laravel 的 with 多表查询问题
现在有三张表,schools
,students
,books
,关联关系如下:
现在要做一个搜索功能,要搜索书的借出信息,有三个输入框,分别对应三个关键词,
<input type="text" name="book_name">
<input type="text" name="student_name">
<input type="text" name="school_name">
school_name
,student_name
,book_name
,有以下几种情况:
- 当输入的
book_name
为死刑宣告
,其余为空,检索所有死刑宣告
的书籍借记信息; - 当输入
book_name
为死刑宣告
,student_name
为熊仔
(加入熊仔
借了死刑宣告
这本书),其余为空时,检索该书与熊仔
的借记情况,于是我写代码如下:
Book::where('name','死刑宣告')->with(['user'=>function($query){
$query->where('name','不知道谁'); // 这里并没有 不知道谁这个用户
}])->get();
这样得到的结果很蛋疼
[
{
id:1,
name:'死刑宣告'
user:null
}
]
,这个结果很不符合预期啊,我预期的结果是
[]
写到这里,突然感觉有些异样,感觉
Book这个模型与with的关系
这个知识点没有搞清,希望大神来讲解一下。
后续还有个三表关联的搜索,代码如下:
Book::where('name','死刑宣告')->with(['user'=>function($query){
$query->where('name','不知道谁')->with('school' => function($query){
$query->where('name',$school_name);
});
}])->get();
因为上面的问题,这个也是不对的。望大牛指点下!!
高认可度评论:
可以设计一张表:
borrowed
用来记录借阅信息。字段如下:
*_name
是用来搜索的,*_id
是用来做关联表的,注意都要加index
。创建
Borrowed
数据模型,模型里把 school , student, book 对应上。其实有个东东叫whereHas.....
可以设计一张表:
borrowed
用来记录借阅信息。字段如下:
*_name
是用来搜索的,*_id
是用来做关联表的,注意都要加index
。创建
Borrowed
数据模型,模型里把 school , student, book 对应上。前端最好弄个自动补全的插件,直接定位到 school , student, book 的 ID 。
可以试试看这个插件 https://github.com/devbridge/jQuery-Autoco...
如果能直接定位到 school , student, book 的 ID 的话,
borrowed
的字段可以精简如下:就可以直接通过
*_id
来直接取:@Summer 谢谢站长!么么哒!:laughing:
其实有个东东叫whereHas.....
@hareluya :joy: 刚试了下
whereHas
,Ok了。谢谢@maxiaoxiong 请问
whereHas
怎么用的@maxiaoxiong 这个图,是什么软件做的呀,哥们
@dreamhack mysql workbench
@maxiaoxiong 哈哈哈哈,多谢,这么一看是挺像的,这玩意mac上总是卡死,你遇到过吗
@dreamhack 没,mac上直接用phpstorm可以生成 Reliation Diagram
问一下 ->with('post',function($query){
$query->where('name','zzz')
}) 和
->wherehas('post',function($query){
$query->where('name','zzz')
})的区别?
with会把post放入结果集中返回,post中的条件不匹配post=null,不影响主表的结果;whereHas生成的sql是exists,post中的条件不匹配会影响主表结果
我也遇到了你这个问题,请问你是怎么解决的,跪求