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

网友投稿 876 2022-05-29

渴求式加载

当以属性方式访问 Eloquent关联关系的时候,关联关系数据是「懒惰式加载」的,这意味着关联关系数据直到第一次访问的时候才被加载。不过,Eloquent 还可以在查询父级模型的同时「渴求式加载」关联关系。渴求式加载缓解 N+1 查询问题,要阐明 N+1 查询问题,查看关联到 Auth的 Book模型:

Laravel学院文档: https://laravelacademy.org/post/9584.html

根据官方文档, 创建两个表,不多说.

新建两个model模型

php artisan make:model Auth php artisan mkae:model Book

然后创建对应的表关联关系

namespace App;

use Illuminate\Database\Eloquent\Model;

class Book extends Model

{

protected $table = 'book';

public function auth()

{

return $this->belongsTo('App\Auth');

}

}

public function lst()

{

$books = Book::all();

foreach ($books as $book){

echo $book->auth->name;

}

}

去页面查看输出信息和SQL语句

public function lst()

{

$books = Book::with('auth')->get();

foreach ($books as $book){

echo $book->auth->name;

}

}

查看输出结果,发现,效果一样,但原本执行的多条sql 变成了两条

渴求式加载多个关联关系

有时候你需要在单个操作中渴求式加载多个不同的关联关系。要实现这个功能,只需要添加额外的参数到with方法即可:

在这里,我又新建了一个category表

在Book模型中又加了一个与category表的关联关系

public function category()

{

//这里我在book表中与category表关联的外键字段是cate_id,而laravel中默认是category_id,所以修改第二个参数为cate_id

return $this->belongsTo('App\Category','cate_id');

}

修改代码

public function lst()

{

$books = Book::with('auth','category')->get();

foreach ($books as $book){

echo $book->category->name;

echo $book->auth->name;

}

}

namespace App;

use Illuminate\Database\Eloquent\Model;

class Auth extends Model

{

protected $table = 'auth';

public function contact()

{

return $this->belongsTo('App\Contact');

}

}

然后修改控制器中的代码

public function lst()

{

//通过 . 点号 来加载auth模型的contact关联表

$books = Book::with('auth.contact')->get();

echo '

';

foreach ($books as $book){

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

echo $book->name;

echo '
';

echo $book->auth->name;

echo '
';

echo $book->auth->contact->email;

echo '


';

}

}

查看页面输出信息,这里将auth关联的contact表的信息也查出来了.

渴求式加载指定字段

并不是每次获取关联关系时都需要所有字段,因此,Eloquent 允许你在关联查询时指定要查询的字段:

$users = Book::with('auth:id,name')->get();

注:使用这个特性时,id字段是必须列出的。

public function lst()

{

$books = Book::with('auth:id,name')->get()->toArray();

dd($books);

}

查看页面输出代码 auth下只有id和name两个字段了 其他多余的字段都没有了

带条件约束的渴求式加载

有时候我们希望渴求式加载一个关联关系,但还想为渴求式加载指定更多的查询条件:

$books = Book::with(['auth' => function ($query) {

//约束条件

$query->where('name', 'like', '吴%');

}])->get();

dd($books);

$books = Book::with(['auth' => function ($query) {

$query->orderBy('name', 'desc');

}])->get();

懒惰渴求式加载

有时候你需要在父模型已经被获取后渴求式加载一个关联关系。例如,这在你需要动态决定是否加载关联模型时可能很有用:

$books = Book::all();

$res = true;

if($res){

$books->load('auth','category');

}

dd(collect($books)->toArray());

如果你需要设置更多的查询条件到渴求式加载查询上,可以传递一个包含你想要记载的关联关系数组到 load 方法,数组的值应该是接收查询实例的闭包:

$books->load(['auth' => function ($query) {

$query->orderBy('name', 'asc');

}]);

如果想要在关系管理尚未被加载的情况下加载它,可以使用 loadMissing 方法:

public function lst(Book $book)

{

$book->loadMissing('auth');

return [

'name' => $book->name,

'auth' => $book->auth->name

];

}

最后这个…试了很久,在大佬的帮助下完成了.

直接从文档复制过来就报错了!!!坑啊

需要在路由那传递一个id

Route::get('book/{id}','ArticleController@lst');

去掉loadMissing之后…下面那行sql语句变了,但是感觉没啥用啊.不知道这个东西有什么用.

原文:https://blog.csdn.net/u013032345/article/details/82772938

Laravel SQL

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:C#之四十六 迷你贪吃蛇项目
下一篇:Docker--容器技术
相关文章