Laravel ORM中with,wherehas使用和区别

Laravel ORM中with,wherehas使用和区别

with -预加载

当作为属性访问 Eloquent 关联时,关联数据是「懒加载」的。意味着在你第一次访问该属性时,才会加载关联数据。不过,是当你查询父模型时,Eloquent 可以「预加载」关联数据。预加载避免了 N + 1 查询问题。要说明 N + 1 查询问题,试想一个 Book 模型关联到 Author 模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Book extends Model
{
    /**
     * 获得此书的作者。
     */
    public function author()
    {
        return $this->belongsTo('App\Author');
    }
}

现在,让我们来获得所有书籍和作者数据:

$books = App\Book::all();

foreach ($books as $book) {
    echo $book->author->name;
}

这个循环会运行一次查询取回所有数据表上的书籍数据,然后又运行一次查询获得每本书的作者数据。如果我们有 25 本书,则循环就会执行 26 次查询:1 次是获得所有书籍数据,另外 25 条查询用来获得每本书的作者数据。

谢天谢地,我们使用预加载让整个查询减少到 2 次。这是通过指定关联给 with 方法办到的:

$books = App\Book::with('author')->get();

foreach ($books as $book) {
    echo $book->author->name;
}

整个操作,只执行了两条查询:

select * from books

select * from authors where id in (1, 2, 3, 4, 5, ...)

基于存在的关联查询 has wherehas

如果您需要更高级的用法,可以使用 whereHas 和 orWhereHas 方法在 has 查询里设置「where」条件。此方法可以让你增加自定义条件至关联约束中,例如对评论内容进行检查:

// 获得所有至少有一条评论内容满足 foo% 条件的文章
$posts = Post::whereHas('comments', function ($query) {
    $query->where('content', 'like', 'foo%');
})->get(); 

用法

with([‘关联关系:id,name’])
whereHas(‘关联关系’, function ($query){})

区别

with – 类似于 SQL 中的 left join。
has – 类似于 SQL 中的 inner join。
whereHas – 是has的补充,可以补充查询条件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值