关于 Laravel 的 with 多表查询问题

现在有三张表,schoolsstudentsbooks,关联关系如下:

file

现在要做一个搜索功能,要搜索书的借出信息,有三个输入框,分别对应三个关键词,

<input type="text" name="book_name">
<input type="text" name="student_name">
<input type="text" name="school_name">

school_namestudent_namebook_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();

因为上面的问题,这个也是不对的。望大牛指点下!!

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 13
Summer

可以设计一张表:borrowed 用来记录借阅信息。

字段如下:

  • school_name
  • school_id
  • student_name
  • student_id
  • book_name
  • book_id

*_name 是用来搜索的,*_id 是用来做关联表的,注意都要加 index

创建 Borrowed 数据模型,模型里把 school , student, book 对应上。

Borrowed::where('book_name', '书的名字')->...
          with('school' , 'student', 'book')->get()
7年前 评论
hareluya

其实有个东东叫whereHas.....

7年前 评论
Summer

可以设计一张表:borrowed 用来记录借阅信息。

字段如下:

  • school_name
  • school_id
  • student_name
  • student_id
  • book_name
  • book_id

*_name 是用来搜索的,*_id 是用来做关联表的,注意都要加 index

创建 Borrowed 数据模型,模型里把 school , student, book 对应上。

Borrowed::where('book_name', '书的名字')->...
          with('school' , 'student', 'book')->get()
7年前 评论
Summer

前端最好弄个自动补全的插件,直接定位到 school , student, book 的 ID 。

可以试试看这个插件 https://github.com/devbridge/jQuery-Autoco...

如果能直接定位到 school , student, book 的 ID 的话,borrowed 的字段可以精简如下:

  • school_id
  • student_id
  • book_id

就可以直接通过 *_id 来直接取:

Borrowed::where('book_1', $request->book_id)->...
      with('school' , 'student', 'book')->get()
7年前 评论

@Summer 谢谢站长!么么哒!:laughing:

7年前 评论
hareluya

其实有个东东叫whereHas.....

7年前 评论

@hareluya :joy: 刚试了下whereHas,Ok了。谢谢

7年前 评论

@maxiaoxiong 请问whereHas怎么用的

7年前 评论

@maxiaoxiong 这个图,是什么软件做的呀,哥们

6年前 评论

@maxiaoxiong 哈哈哈哈,多谢,这么一看是挺像的,这玩意mac上总是卡死,你遇到过吗

6年前 评论

@dreamhack 没,mac上直接用phpstorm可以生成 Reliation Diagram

6年前 评论

问一下 ->with('post',function($query){
$query->where('name','zzz')
}) 和
->wherehas('post',function($query){
$query->where('name','zzz')
})的区别?

4年前 评论

with会把post放入结果集中返回,post中的条件不匹配post=null,不影响主表的结果;whereHas生成的sql是exists,post中的条件不匹配会影响主表结果

4年前 评论

我也遇到了你这个问题,请问你是怎么解决的,跪求

3年前 评论

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