GVKun编程网logo

php – Laravel Eloquent toArray不使用方括号

1

本篇文章给大家谈谈php–LaravelEloquenttoArray不使用方括号,同时本文还将给你拓展Laravel5基础(七)-Eloquent(laravel的ORM)、Laravel5.1文档

本篇文章给大家谈谈php – Laravel Eloquent toArray不使用方括号,同时本文还将给你拓展Laravel 5 基础(七)- Eloquent (laravel 的ORM)、Laravel 5.1 文档攻略--Laravel Eloquent ORM最强大也是最难理解的部分:数据关系、Laravel 5.1 文档攻略——Laravel Eloquent ORM最强大也是最难理解的部分:数据关系、laravel Builder scope count() 出错 Eloquent/Builder.php 1185行等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

php – Laravel Eloquent toArray不使用方括号

php – Laravel Eloquent toArray不使用方括号

我正在写一个api并尝试将大量结果转换为 JSON.当雄辩的结果转换为数组时,我期待这样的事情:

[
  {
     "id": "0",...
  },{
     "id": "",]

但相反,Laravel使用表键将其显示为键值列表:

"0":{
       {
          "id": "0",...
       }
    },"1":{
       {
          "id": "1",...
       }
    }

这是功能:

$results = \App\Event::with('sandBoxes')->get()->sortBy('start_time')->forPage($pageNum,$perPage);
    return response()->json(array(
        "events" => $page,));

我怎样才能让Laravel给我一个合适的阵列?

解决方法

当您第一次收到活动时,您的收藏品看起来像这样:

[
    0 => Event1,1 => Event2,2 => Event3
]

这是一个正确索引的数值数组,可以用JSON表示为数组.但是,一旦获得了Collection,就可以在其上调用sortBy(),对Collection中的项进行排序.此排序重新排列数组内的项和键的值.此时,您的收藏可能看起来像:

[
    1 => Event2,0 => Event1,2 => Event3
]

这不是正确索引的数字数组,不能在JSON中表示为数组.此数组必须表示为对象,这是您所看到的.

为了获得您期望的结果,您需要在对其进行排序后重新键入集合中的项目.您可以使用Collection上的values()方法执行此操作(它只调用内部项数组上的array_values()).

一旦你重新修改了你的Collection,它将看起来像:

[
    0 => Event2,1 => Event1,2 => Event3
]

现在这是一个正确索引的数字数组,可以用JSON表示为数组.

所以,你的代码应该类似于:

$results = \App\Event::with('sandBoxes')
    ->get()
    ->sortBy('start_time')
    ->values() // re-key the items in the collection after sorting
    ->forPage($pageNum,$perPage);

Laravel 5 基础(七)- Eloquent (laravel 的ORM)

Laravel 5 基础(七)- Eloquent (laravel 的ORM)

  • 我们来生成第一个模型

1

2

3

4

php artisan make:model Article

#输出

Model created successfully.

Created Migration: 2015_03_28_062517_create_articles_table

登录后复制

查看一下生成的文件 app/article.php

1

2

3

4

5

6

7

8

9

<?php namespace App;

 

use Illuminate\Database\Eloquent\Model;

 

class Article extends Model {

 

    //

 

}

登录后复制

没什么特别的,除了继承自 Model 以外,但是具有强大的功能,这些都封装在laravel的Model中。模型自动具有了 save() update() findXXX() 等强大的功能。

  • tinker 是 laravel提供的命令行工具,可以和项目进行交互。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

php artisan tinker

 

#以下是在tinker中的交互输入

Psy Shell v0.4.1 (PHP 5.4.16 — cli) by Justin Hileman

&gt;&gt;&gt; $name = ''zhang jinglin'';

=&gt; "zhang jinglin"

 

&gt;&gt;&gt; $name

=&gt; "zhang jinglin"

 

&gt;&gt;&gt; $article = new App\Article;

=&gt; <app> {}

 

&gt;&gt;&gt; $article-&gt;title = ''My First Article'';

=&gt; "My First Article"

 

&gt;&gt;&gt; $article-&gt;body = ''Some content...'';

=&gt; "Some content..."

 

&gt;&gt;&gt; $article-&gt;published_at = Carbon\Carbon::now();

=&gt; <carbon> {

       date: "2015-03-28 06:37:22",

       timezone_type: 3,

       timezone: "UTC"

   }

 

&gt;&gt;&gt; $article;

=&gt; <app> {

       title: "My First Article",

       body: "Some content...",

       published_at: <carbon> {

           date: "2015-03-28 06:37:22",

           timezone_type: 3,

           timezone: "UTC"

       }

   }

 

&gt;&gt;&gt; $article-&gt;toArray();

=&gt; [

       "title"        =&gt; "My First Article",

       "body"         =&gt; "Some content...",

       "published_at" =&gt; <carbon> {

           date: "2015-03-28 06:37:22",

           timezone_type: 3,

           timezone: "UTC"

       }

   ]

 

&gt;&gt;&gt; $article-&gt;save();

=&gt; true

 

#查看数据结果,添加了一条记录

 

&gt;&gt;&gt; App\Article::all()-&gt;toArray();

=&gt; [

       [

           "id"           =&gt; "1",

           "title"        =&gt; "My First Article",

           "body"         =&gt; "Some content...",

           "published_at" =&gt; "2015-03-28 06:37:22",

           "created_at"   =&gt; "2015-03-28 06:38:53",

           "updated_at"   =&gt; "2015-03-28 06:38:53"

       ]

   ]

 

&gt;&gt;&gt; $article-&gt;title = ''My First Update Title'';

=&gt; "My First Update Title"

 

&gt;&gt;&gt; $article-&gt;save();

=&gt; true

 

&gt;&gt;&gt; App\Article::all()-&gt;toArray();

=&gt; [

       [

           "id"           =&gt; "1",

           "title"        =&gt; "My First Update Title",

           "body"         =&gt; "Some content...",

           "published_at" =&gt; "2015-03-28 06:37:22",

           "created_at"   =&gt; "2015-03-28 06:38:53",

           "updated_at"   =&gt; "2015-03-28 06:42:03"

       ]

   ]

    

&gt;&gt;&gt; $article = App\Article::find(1);

=&gt; <app> {

       id: "1",

       title: "My First Update Title",

       body: "Some content...",

       published_at: "2015-03-28 06:37:22",

       created_at: "2015-03-28 06:38:53",

       updated_at: "2015-03-28 06:42:03"

   }

 

&gt;&gt;&gt; $article = App\Article::where(''body'', ''Some content...'')-&gt;get();

=&gt; <illuminate> [

       <app> {

           id: "1",

           title: "My First Update Title",

           body: "Some content...",

           published_at: "2015-03-28 06:37:22",

           created_at: "2015-03-28 06:38:53",

           updated_at: "2015-03-28 06:42:03"

       }

   ]

 

&gt;&gt;&gt; $article = App\Article::where(''body'', ''Some content...'')-&gt;first();

=&gt; <app> {

       id: "1",

       title: "My First Update Title",

       body: "Some content...",

       published_at: "2015-03-28 06:37:22",

       created_at: "2015-03-28 06:38:53",

       updated_at: "2015-03-28 06:42:03"

   }

&gt;&gt;&gt;

 

&gt;&gt;&gt; $article = App\Article::create([''title'' =&gt; ''New Article'', ''body'' =&gt; ''New body'', ''published_at'' =&gt; Carbon\Carbon::now()]);

Illuminate\Database\Eloquent\MassAssignmentException with message ''title''</app></app></illuminate></app></carbon></carbon></app></carbon></app>

登录后复制

MassAssignmentException,laravel保护我们不能直接插入记录。比如,在一些特殊情况下我们需要直接利用表单的信息填充数据库记录,但是如果我们并没有在表单中添加密码字段,而黑客产生了密码字段连同我们的其他字段一起送回服务器,这将产生修改密码的危险,所以我们必须明确的告诉laravel我们的模型那些字段是可以直接填充的。

修改我们的模型文件 Article.php

1

2

3

4

5

6

7

8

9

10

11

12

13

<?php namespace App;

 

use Illuminate\Database\Eloquent\Model;

 

class Article extends Model {

 

    protected $fillable = [

        &#39;title&#39;,

        &#39;body&#39;,

        &#39;published_at&#39;

    ];

 

}

登录后复制

表示,title, body, published_at 是可以直接填充的。

退出 tinker,重新进入

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

&gt;&gt;&gt; $article = App\Article::create([''title'' =&gt; ''New Article'', ''body'' =&gt; ''New body'', ''published_at'' =&gt; Carbon\Carbon::now()]);

=&gt; <app> {

       title: "New Article",

       body: "New body",

       published_at: <carbon> {

           date: "2015-03-28 06:55:19",

           timezone_type: 3,

           timezone: "UTC"

       },

       updated_at: "2015-03-28 06:55:19",

       created_at: "2015-03-28 06:55:19",

       id: 2

   }

    

# It''s ok

 

&gt;&gt;&gt; App\Article::all()-&gt;toArray();

=&gt; [

       [

           "id"           =&gt; "1",

           "title"        =&gt; "My First Update Title",

           "body"         =&gt; "Some content...",

           "published_at" =&gt; "2015-03-28 06:37:22",

           "created_at"   =&gt; "2015-03-28 06:38:53",

           "updated_at"   =&gt; "2015-03-28 06:42:03"

       ],

       [

           "id"           =&gt; "2",

           "title"        =&gt; "New Article",

           "body"         =&gt; "New body",

           "published_at" =&gt; "2015-03-28 06:55:19",

           "created_at"   =&gt; "2015-03-28 06:55:19",

           "updated_at"   =&gt; "2015-03-28 06:55:19"

       ]

   ]

 

&gt;&gt;&gt; $article = App\Article::find(2);

=&gt; <app> {

       id: "2",

       title: "New Article",

       body: "New body",

       published_at: "2015-03-28 06:55:19",

       created_at: "2015-03-28 06:55:19",

       updated_at: "2015-03-28 06:55:19"

   }

 

&gt;&gt;&gt; $article-&gt;update([''body'' =&gt; ''New Updaet Body'']);

=&gt; true

 

#update自动调用save()

</app></carbon></app>

登录后复制

以上就介绍了Laravel 5 基础(七)- Eloquent (laravel 的ORM),包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

Laravel 5.1 文档攻略--Laravel Eloquent ORM最强大也是最难理解的部分:数据关系

Laravel 5.1 文档攻略--Laravel Eloquent ORM最强大也是最难理解的部分:数据关系

简介

其实大家都知道,数据表之间都是可以关联的,eloquent orm是数据模型操作代替表操作,那么表的关联查询,在eloquent这里也就是模型间的关联查询,这就是本章的主要内容;

Eloquent一个支持以下6种表间关系:

  • One To One(一对一)

  • One To Many(一对多)

  • Many To Many(多对多)

  • Has Many Through(跨表一对多)

  • Polymorphic Relations(belongsTo多态)

  • Many To Many Polymorphic Relations(belongsToMany多态)

前三个关系是什么就不多解释了(请自行百度),这个地方需要很多耐心,努力让自己习惯对象思维,暂时先不要用sql,练一段时间就会发现非常好用;

当然,也有人吐槽Eloquent由于过于强大,造成每次加载都带一大堆东西,影响效率(实际没啥影响,不服的拿数据跟我说),但是在代码的编写效率,可读性,可维护性上可以说是质的飞跃,所以还是强烈建议优先使用。

这一章我是学得最早,但是教程是写的最晚的,因为各种关系比较复杂,好在我是做产品出身,应该可以把复杂的事情解释清楚,下面就让我们来认识一下这个星球上最强大的ORM:Eloquent

基本概念

先看看是怎么使用的吧:

$user->posts()->where(''active'', 1)->get();
登录后复制
登录后复制

这个就是通过 $user 对象查出他一共发布了多少篇文章(状态为已发布的)。

我们看到 posts() 在这里是 $user 的一个方法,所以要使用关联查询,得先在 $user 模型里定义关系(方法);

一对一

从这张图中,我们可以看到要使用Eloquent 模型关系,第一步要在模型里定义模型关系,第二步数据库要准备正确的表;第三部分使用 查询的方法,第四部分是使用绑定和解除绑定的方法,我们后续的模型关系都按照这个流程理解和解释;

要点:反复观察图!

定义模型

定义User模型

namespace App;use Illuminate\Database\Eloquent\Model;class User extends Model{ public function phone() { return $this->hasOne(''App\Phone''); }}
登录后复制

定义Phone模型

namespace App;use Illuminate\Database\Eloquent\Model;class Phone extends Model{ public function user() { return $this->belongsTo(''App\User''); }}
登录后复制

注意:定义模型的时候方法名注意单复数,“一”就用单数,“多”就用复数,这样不容易混淆搞错。 hasOne() 类似这个关系绑定方法有很多,需要在使用中慢慢熟悉,注意观察。

数据表

主要是注意,外键和中间表这些东西,本例中没有中间表;

关系查询

模型关系方法查询

$user->posts()->where(''active'', 1)->get();
登录后复制
登录后复制

这就是模型方法查询, $user->posts() 这里查出来是个DQB对象,后面可以接各种数据库查询方法;

动态属性查询

$user->posts;
登录后复制

你可以把关系当做属性用,直接查出来一个collection集;缺点是后面不能跟DQB方法了。

这两种方法都很常用,酌情使用;(下同,不再解释)

关系绑定和解除

通用的绑定方法就是save();

通用的解除方法,对于belongsTo的关系是dissociate(); 对于belongsToMany的关系是detach();

还有一些特定的绑定解除方法,我们再单独的关系模型中讲;

一对多

反绑

如果你要通过belongsTo关系绑定,可以用associate()来绑定,最后要save()一下,如图;

多对多

由于belongsTo换成了belongsToMany, 所以对应的绑定方法换成了attach()和detach();注意这里面填对象ID,可以用数组形式批量绑定;

save()方法仍然适用与关系绑定;

对中间表的操作

由于多对多关系多了一张中间表,Eloquent除了默认对这里面的外键进行操作以外,还可以对中间表的其他字段进行操作,看示例:

App\User::find(1)->roles()->save($role, [''expires'' => $expires]);
登录后复制
$user->roles()->attach($roleId, [''expires'' => $expires]);
登录后复制
$user->roles()->attach([1 => [''expires'' => $expires], 2, 3]);
登录后复制
$user->roles()->sync([1 => [''expires'' => true], 2, 3]);
登录后复制

sync()方法

sync就是同步,意思是说中间表会同步成sync()里面参数一样,没有写在参数里的都会移除,因此可以用来解除绑定;

Has Many Through(跨表一对多)

其实这只是一种快速查询方法,看图,本来可以先通过Conuntry查User,然后通过User查Post,现在你可以通过Country直接查Post;

通常Country和User,User和Post的表间关系都是事先建立好的,这个时候你再使用hasManyThrough;

Polymorphic Relations(belongsTo多态)

本来belongsTo只能属于一种对象的,就像女朋友只能属于男朋友;现在好了,女朋友不仅可以属于男朋友,还可以属于干爹了。

开玩笑的,最常见的应用还是图片,可以属于多种模型,看图;

我们发现这里的动词变成了morphTo(), morphMany();

先上一小段英语课,提升一下语感:

morph这个词的意思是改变形态,简称变态;这个和变形金刚的那个transform是不一样的,那个主要是改变形状;

morphTo(), morphMany(); 其实就是belongsTo() 和 hasMany() 多态形式,多态就是不仅拥有男票,还有干爹,有点“变态”;

关于绑定和解绑

associate()不适用用于morphTo();所以只能单向的用save()绑定了;

关于解绑,dissociate()也不适用用于morphTo();所以,只能把Photo实例删除!!删除了就没任何关系了(因为没有中间表)

感觉有点不是很自然的设计,不过目前调查下来情况就是这样;

Many To Many Polymorphic Relations(belongsToMany多态)

这个最典型的应用就是标签了,标签要涉及多对多的关系,还涉及对应不同类型的模型的问题,所以就是belongsToMany+多态;

看图,可绑定,可解绑;

Eager Loading(预加载)

这个问题很简单,看个实例你就懂了:

$books = App\Book::all();foreach ($books as $book) { echo $book->author->name;}
登录后复制

万一books有一万本,那么循环就要1万次,每次循环,因为用了关联查询 $book->author->name; ,都会读数据库一次,意味着至少读数据库一万次,数据库哭了。

Eager Loading 就是让数据库读取发生在循环之前:

$books = App\Book::with(''author'')->get();foreach ($books as $book) { echo $book->author->name;}
登录后复制

看,加了个神奇的with()后,所有数据在foreach前都读出来了,后面循环的只是读出来的数据,一共查询数据库2次!!

Eager Loading可以极大的缓解数据库查询压力,是性能优化的重要手段!

Eager Loading 多个关系

就是一次多加几张关联表而已;

$books = App\Book::with(''author'', ''publisher'')->get();
登录后复制

嵌套 Eager Loading

$books = App\Book::with(''author.contacts'')->get();
登录后复制

把书的作者读出来,顺便把作者的联系方式读出来。

有条件的 Eager Loading

上面说的是整张表整张表的读出来,太土豪了,其实有时候我们只需要表里的部分记录:

$users = App\User::with([''posts'' => function ($query) { $query->where(''title'', ''like'', ''%first%'');}])->get();
登录后复制

这中闭包的写法我们讲过多次,就是加个条件而已;

Lazy Eager Loading

这标题难道不是自相矛盾吗?又Lazy,又Eager?

哦,原来是在lazy的流程里判断需不需要eager loading一下:

$books = App\Book::all();if ($someCondition) { $books->load(''author'', ''publisher'');}
登录后复制
$books->load([''author'' => function ($query) { $query->orderBy(''published_date'', ''asc'');}]);
登录后复制

注意这个load(),这是对collection用的;

跨模型更新时间戳

简单的来说,就是一条评论更新的时候,顺便把文章的''updated_at''字段也更新了;

namespace App;use Illuminate\Database\Eloquent\Model;class Comment extends Model{ /** * All of the relationships to be touched. * * @var array */ protected $touches = [''post'']; /** * Get the post that the comment belongs to. */ public function post() { return $this->belongsTo(''App\Post''); }}
登录后复制

设置$touches这个属性;

然后你更新Comment的时候,就会把Post的''updated_at''字段也更新了;

更多内容请访问: Laravel 5.1 文档攻略

Laravel 5.1 文档攻略——Laravel Eloquent ORM最强大也是最难理解的部分:数据关系

Laravel 5.1 文档攻略——Laravel Eloquent ORM最强大也是最难理解的部分:数据关系

简介

其实大家都知道,数据表之间都是可以关联的,Eloquent ORM是数据模型操作代替表操作,那么表的关联查询,在Eloquent这里也就是模型间的关联查询,这就是本章的主要内容;

Eloquent一个支持以下6种表间关系:

  • One To One(一对一)

  • One To Many(一对多)

  • Many To Many(多对多)

  • Has Many Through(跨表一对多)

  • Polymorphic Relations(belongsTo多态)

  • Many To Many Polymorphic Relations(belongsToMany多态)

前三个关系是什么就不多解释了(请自行百度),这个地方需要很多耐心,努力让自己习惯对象思维,暂时先不要用sql,练一段时间就会发现非常好用;

当然,也有人吐槽Eloquent由于过于强大,造成每次加载都带一大堆东西,影响效率(实际没啥影响,不服的拿数据跟我说),但是在代码的编写效率,可读性,可维护性上可以说是质的飞跃,所以还是强烈建议优先使用。

这一章我是学得最早,但是教程是写的最晚的,因为各种关系比较复杂,好在我是做产品出身,应该可以把复杂的事情解释清楚,下面就让我们来认识一下这个星球上最强大的ORM:Eloquent

基本概念

先看看是怎么使用的吧:

$user->posts()->where(''active'', 1)->get();

这个就是通过$user对象查出他一共发布了多少篇文章(状态为已发布的)。

我们看到posts()在这里是 $user 的一个方法,所以要使用关联查询,得先在$user模型里定义关系(方法);

一对一

\oneToOne.png

从这张图中,我们可以看到要使用Eloquent 模型关系,第一步要在模型里定义模型关系,第二步数据库要准备正确的表;第三部分使用 查询的方法,第四部分是使用绑定和解除绑定的方法,我们后续的模型关系都按照这个流程理解和解释;

要点:反复观察图!

定义模型

定义User模型

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    
    public function phone()
    {
        return $this->hasOne(''App\Phone'');
    }
}

定义Phone模型

namespace App;

use Illuminate\Database\Eloquent\Model;

class Phone extends Model
{

    public function user()
    {
        return $this->belongsTo(''App\User'');
    }
}

注意:定义模型的时候方法名注意单复数,“一”就用单数,“多”就用复数,这样不容易混淆搞错。hasOne() 类似这个关系绑定方法有很多,需要在使用中慢慢熟悉,注意观察。

数据表

主要是注意,外键和中间表这些东西,本例中没有中间表;

关系查询

模型关系方法查询

$user->posts()->where(''active'', 1)->get();

这就是模型方法查询,$user->posts() 这里查出来是个DQB对象,后面可以接各种数据库查询方法;

动态属性查询

$user->posts;

你可以把关系当做属性用,直接查出来一个collection集;缺点是后面不能跟DQB方法了。

这两种方法都很常用,酌情使用;(下同,不再解释)

关系绑定和解除

通用的绑定方法就是save();

通用的解除方法,对于belongsTo的关系是dissociate(); 对于belongsToMany的关系是detach();

还有一些特定的绑定解除方法,我们再单独的关系模型中讲;

一对多

\OneToMany.png

反绑

如果你要通过belongsTo关系绑定,可以用associate()来绑定,最后要save()一下,如图;

多对多

\manyToMany.png

由于belongsTo换成了belongsToMany, 所以对应的绑定方法换成了attach()和detach();注意这里面填对象ID,可以用数组形式批量绑定;

save()方法仍然适用与关系绑定;

对中间表的操作

由于多对多关系多了一张中间表,Eloquent除了默认对这里面的外键进行操作以外,还可以对中间表的其他字段进行操作,看示例:

App\User::find(1)->roles()->save($role, [''expires'' => $expires]);
$user->roles()->attach($roleId, [''expires'' => $expires]);
$user->roles()->attach([1 => [''expires'' => $expires], 2, 3]);
$user->roles()->sync([1 => [''expires'' => true], 2, 3]);

sync()方法

sync就是同步,意思是说中间表会同步成sync()里面参数一样,没有写在参数里的都会移除,因此可以用来解除绑定;

Has Many Through(跨表一对多)

\hasManyThrough.png

其实这只是一种快速查询方法,看图,本来可以先通过Conuntry查User,然后通过User查Post,现在你可以通过Country直接查Post;

通常Country和User,User和Post的表间关系都是事先建立好的,这个时候你再使用hasManyThrough;

Polymorphic Relations(belongsTo多态)

\morphTo.png

本来belongsTo只能属于一种对象的,就像女朋友只能属于男朋友;现在好了,女朋友不仅可以属于男朋友,还可以属于干爹了。

开玩笑的,最常见的应用还是图片,可以属于多种模型,看图;

我们发现这里的动词变成了morphTo(), morphMany();

先上一小段英语课,提升一下语感:

morph这个词的意思是改变形态,简称变态;这个和变形金刚的那个transform是不一样的,那个主要是改变形状;

morphTo(), morphMany(); 其实就是belongsTo() 和 hasMany() 多态形式,多态就是不仅拥有男票,还有干爹,有点“变态”;

关于绑定和解绑

associate()不适用用于morphTo();所以只能单向的用save()绑定了;

关于解绑,dissociate()也不适用用于morphTo();所以,只能把Photo实例删除!!删除了就没任何关系了(因为没有中间表)

感觉有点不是很自然的设计,不过目前调查下来情况就是这样;

Many To Many Polymorphic Relations(belongsToMany多态)

\morphToMany.png

这个最典型的应用就是标签了,标签要涉及多对多的关系,还涉及对应不同类型的模型的问题,所以就是belongsToMany+多态;

看图,可绑定,可解绑;

Eager Loading(预加载)

这个问题很简单,看个实例你就懂了:

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

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

万一books有一万本,那么循环就要1万次,每次循环,因为用了关联查询$book->author->name;,都会读数据库一次,意味着至少读数据库一万次,数据库哭了。

Eager Loading 就是让数据库读取发生在循环之前:

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

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

看,加了个神奇的with()后,所有数据在foreach前都读出来了,后面循环的只是读出来的数据,一共查询数据库2次!!

Eager Loading可以极大的缓解数据库查询压力,是性能优化的重要手段!

Eager Loading 多个关系

就是一次多加几张关联表而已;

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

嵌套 Eager Loading

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

把书的作者读出来,顺便把作者的联系方式读出来。

有条件的 Eager Loading

上面说的是整张表整张表的读出来,太土豪了,其实有时候我们只需要表里的部分记录:

$users = App\User::with([''posts'' => function ($query) {
    $query->where(''title'', ''like'', ''%first%'');

}])->get();

这中闭包的写法我们讲过多次,就是加个条件而已;

Lazy Eager Loading

这标题难道不是自相矛盾吗?又Lazy,又Eager?

哦,原来是在lazy的流程里判断需不需要eager loading一下:

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

if ($someCondition) {
    $books->load(''author'', ''publisher'');
}
$books->load([''author'' => function ($query) {
    $query->orderBy(''published_date'', ''asc'');
}]);

注意这个load(),这是对collection用的;

跨模型更新时间戳

简单的来说,就是一条评论更新的时候,顺便把文章的''updated_at''字段也更新了;

namespace App;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
    /**
     * All of the relationships to be touched.
     *
     * @var array
     */
    protected $touches = [''post''];

    /**
     * Get the post that the comment belongs to.
     */
    public function post()
    {
        return $this->belongsTo(''App\Post'');
    }
}

设置$touches这个属性;

然后你更新Comment的时候,就会把Post的''updated_at''字段也更新了;

更多内容请访问:Laravel 5.1 文档攻略

laravel Builder scope count() 出错 Eloquent/Builder.php 1185行

laravel Builder scope count() 出错 Eloquent/Builder.php 1185行

 在创建项目的使用登录之后报错

ErrorException in Builder.php line 1185:
count(): Parameter must be an array or an object that implements Countable
in Builder.php line 1185
vendor\laravel\framework\src\Illuminate\Database\Eloquent\Builder.php,然后在到1185后见到这样的代码
 
1
$originalWhereCount = count ( $query ->wheres);
 
 
这里就报错了,原因可能这里空值或其他,我们修改如下
 
1
$originalWhereCount = empty ( $query ->wheres) ? 0 : count ( $query ->wheres);
 
 
                     over

今天的关于php – Laravel Eloquent toArray不使用方括号的分享已经结束,谢谢您的关注,如果想了解更多关于Laravel 5 基础(七)- Eloquent (laravel 的ORM)、Laravel 5.1 文档攻略--Laravel Eloquent ORM最强大也是最难理解的部分:数据关系、Laravel 5.1 文档攻略——Laravel Eloquent ORM最强大也是最难理解的部分:数据关系、laravel Builder scope count() 出错 Eloquent/Builder.php 1185行的相关知识,请在本站进行查询。

本文标签: