资讯专栏INFORMATION COLUMN

Laravel学习笔记七-创建博客

icyfire / 778人阅读

摘要:本节将使用用户创建博文来学习数据模型关联的有关知识。我们发现为我们生成的时间是英文的,如果要使用中文时间,则需要对进行本地化设置。动态属性让你能够访问关联函数,就像他们是在模型中定义的属性会假设对应关联的外键名称是基于模型名称的。

本节将使用用户创建博文来学习数据模型关联的有关知识。

一、Laravel常用知识总结 1.提示信息汉化

如果用Laravel原生的表单提示错误信息,则是英文的,如果需要中文,则需要修改resources/lang/en的英文,这样比较麻烦,不过,我们可以使用github开源的汉化包,然后引入该文件夹,在config/app.php配置文件里边修改语言包引入即可使用。

2.Carbon日期友好化处理

    {{ $status->created_at->diffForHumans() }}
  

该方法的作用是将日期进行友好化处理,我们可以使用 tinker 来查看该方法的具体输出情况。

$ php artisan tinker

在 tinker 中输出第一位用户的创建时间如下。

>>> $created_at = AppModelsUser::first()->created_at
=> CarbonCarbon {#704
     +"date": "1998-12-06 03:15:31.000000",
     +"timezone_type": 3,
     +"timezone": "UTC",
   }

在 tinker 中调用 diffForHumans 方法来输出,结果如下。

>>> $created_at->diffForHumans()
=> "17 years ago"

我们发现 diffForHumans 为我们生成的时间是英文的,如果要使用中文时间,则需要对 Carbon 进行本地化设置。Carbon 是 PHP DateTime 的一个简单扩展,Laravel 将其默认集成到了框架中。

三、Eloquent:关联

数据表之间经常会互相进行关联。例如,一篇博客文章可能会有多条评论,或是一张订单可能对应一个下单客户。Eloquent 让管理和处理这些关联变得很容易,同时也支持多种类型的关联。

定义关联

你可在 Eloquent 模型类内将 Eloquent 关联定义为函数。因为关联像 Eloquent 模型一样也可以作为强大的 查询语句构造器(数据库:查询构造器),定义关联为函数提供了强而有力的链式调用及查找功能。例如:

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

不过,在深入了解使用关联之前,先让我们来学习如何定义每个类型:

1.一对一

一对一关联是很基本的关联。例如一个 User 模型也许会对应一个 Phone。要定义这种关联,我们必须将 phone 方法放置于 User 模型上。phone 方法应该要返回基类 Eloquent 上的 hasOne 方法的结果:

hasOne("AppPhone");
    }
}

传到 hasOne 方法里的第一个参数是关联模型的类名称。定义好关联之后,我们就可以使用 Eloquent 的动态属性来获取关联纪录。动态属性让你能够访问关联函数,就像他们是在模型中定义的属性:

$phone = User::find(1)->phone;

Eloquent 会假设对应关联的外键名称是基于模型名称的。在这个例子里,它会自动假设 Phone 模型拥有 user_id 外键。如果你想要重写这个约定,则可以传入第二个参数到 hasOne 方法里。

return $this->hasOne("AppPhone", "foreign_key");

此外,Eloquent 的默认外键在上层模型的 id 字段会有个对应值。换句话说,Eloquent 会寻找用户的 id 字段与 Phone 模型的 user_id 字段的值相同的纪录。如果你想让关联使用 id 以外的值,则可以传递第三个参数至 hasOne 方法来指定你自定义的键:

return $this->hasOne("AppPhone", "foreign_key", "local_key");
定义相对的关联

所以,我们可以从 User 访问到 Phone 模型。现在,让我们在 Phone 模型上定义一个关联,此关联能够让我们访问拥有此电话的 User。我们可以定义与 hasOne 关联相对应的 belongsTo 方法:

belongsTo("AppUser");
    }
}
2. 一对多

一个「一对多」关联使用于定义单个模型拥有任意数量的其它关联模型。例如,一篇博客文章可能会有无限多个评论。就像其它的 Eloquent 关联一样,可以通过放置一个函数到 Eloquent 模型上来定义一对多关联:

hasMany("AppComment");
    }
}

切记,Eloquent 会自动判断 Comment 模型上正确的外键字段。按约定来说,Eloquent 会取用自身模型的「蛇形命名」后的名称,并在后方加上 _id。所以,以此例来说,Eloquent 会假设 Comment 模型的外键是 post_id

一旦关联被定义,则可以通过 comments 属性来访问评论的集合。切记,因为 Eloquent 提供了「动态属性」,因此我们可以对关联函数进行访问,就像他们是在模型中定义的属性一样:

$comments = AppPost::find(1)->comments;

foreach ($comments as $comment) {
    //
}
定义相对的关联

现在我们已经能访问到所有文章的评论,让我们来接着定义一个通过评论访问上层文章的关联。若要定义相对于 hasMany 的关联,可在下层模型定义一个叫做 belongsTo 方法的关联函数:

belongsTo("AppPost");
    }
}
3. 多对多

多对多关联要稍微比 hasOnehasMany 关联复杂。如一个用户可能拥有多种身份,而一种身份能同时被多个用户拥有。举例来说,很多用户都拥有「管理者」的身份。要定义这种关联,需要使用三个数据表:usersrolesrole_userrole_user 表命名是以相关联的两个模型数据表来依照字母顺序命名,并包含了 user_id 和 role_id 字段

多对多关联通过编写一个在自身 Eloquent 类调用的 belongsToMany 的方法来定义。举个例子,让我们在 User 模型定义 roles 方法:

belongsToMany("AppRole");
    }
}
定义相对的关联

要定义相对于多对多的关联,只需简单的放置另一个名为 belongsToMany 的方法到你关联的模型上。让我们接着以用户身份为例,在 Role 模型中定义 users 方法:

belongsToMany("AppUser");
    }
}

如你所见,此定义除了简单的参考 AppUser 模型外,与 User 的对应完全相同。因为我们重复使用了 belongsToMany 方法,当定义相对于多对多的关联时,所有常用的自定义数据表与键的选项都是可用的。

关联总结 1.一对一
$this->hasOne("AppPhone");
$this->belongsTo("AppUser");

hasOne 关联相对应的 belongsTo 方法

2.一对多
$this->hasMany("AppComment");
$this->belongsTo("AppPost");

hasMany 关联相对应的 belongsTo 方法

3.多对多
$this->belongsToMany("AppRole");
$this->belongsToMany("AppUser");

belongsToMany 关联相对应的 belongsToMany 方法

4.查找关联

你可以查找 posts 关联并增加额外的条件至关联,像这样:

$user = AppUser::find(1);
$user->posts()->where("active", 1)->get();

关联方法与动态属性

如果你不需要增加额外的条件至 Eloquent 的关联查找,则可以简单的像访问属性一样来访问关联。例如我们刚刚的 User 及 Post 模型示例,我们可以像这样来访问所有用户的文章:

$user = AppUser::find(1);

foreach ($user->posts as $post) {
    //
}
预加载

当通过属性访问 Eloquent 关联时,该关联数据会被「延迟加载」。意味着该关联数据只有在你使用属性访问它时才会被加载。不过,Eloquent 可以在你查找上层模型时「预加载」关联数据。预加载避免了 N + 1 查找的问题。要说明 N + 1 查找的问题,可试想一个关联到 Author 的 Book 模型,如下所示:

belongsTo("AppAuthor");
    }
}

现在,让我们来获取所有书籍及其作者的数据:

$books = AppBook::all();

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

上方的循环会运行一次查找并取回所有数据表上的书籍,接着每本书会运行一次查找作者的操作。因此,若存在着 25 本书,则循环就会执行 26 次查找:1 次是查找所有书籍,其它 25 次则是在查找每本书的作者。

很幸运地,我们可以使用预加载来将查找的操作减少至 2 次。可在查找时使用 with 方法来指定想要预加载的关联数据:

$books = AppBook::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, ...)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30545.html

相关文章

  • Laravel学习笔记之Seeder填充数据小技巧

    摘要:而且,与是一对多关系一个分类下有很多,一个只能归属于一个与是一对多关系一篇博客下有很多,一条只能归属于一篇与是多对多关系一篇有很多,一个下有很多。 说明:本文主要聊一聊Laravel测试数据填充器Seeder的小技巧,同时介绍下Laravel开发插件三件套,这三个插件挺好用哦。同时,作者会将开发过程中的一些截图和代码黏上去,提高阅读效率。 备注:在设计个人博客软件时,总会碰到有分类Ca...

    cgspine 评论0 收藏0
  • Laravel学习笔记之Errors Tracking神器——Sentry

    摘要:中异常处理类主要包含两个方法和,其中就是主要用来向第三方发送异常报告,这里选择向这个神器发送异常报告,并使用通知开发人员。通过也能发现的执行流程。 说明:Laravel学习笔记之bootstrap源码解析中聊异常处理时提到过Sentry这个神器,并打算以后聊聊这款神器,本文主要就介绍这款Errors Tracking神器Sentry,Sentry官网有一句话个人觉得帅呆了: Stop ...

    xiguadada 评论0 收藏0
  • Laravel不权威导航

    摘要:版微信第三方登陆包括微信微博等等,查看支持列表扩展好用的图片处理,也方便使用百度版百度版支付集合,包含支付宝等支付宝在的封装各国语言包,包含简体中文生成二维码工具,亲测好用未完大家可以向我推荐,直接在本文下留言即可。 Laravel不权威导航 Hi 这里是Roy整理的Laravel相关索引,希望能帮到大家showImg(http://static.segmentfault.com/bu...

    focusj 评论0 收藏0
  • Laravel+OSS使用笔记

    摘要:为什么使用对象存储对象存储是云服务提供商面向企业和个人开发者提供的高可用,高稳定,强安全的云端存储服务。什么是阿里云对象存储服务,简称,是阿里云提供的海量安全低成本高可靠的云存储服务。 关于作者 程序开发人员,不拘泥于语言与技术,目前主要从事PHP和前端开发,使用Laravel和VueJs,App端使用Apicloud混合式开发。合适和够用是永不停息的追求。 个人网站:https:/...

    CloudwiseAPM 评论0 收藏0
  • Laravel学习笔记一-开发环境搭建

    摘要:配置需要一个来用于与虚拟机进行连接,默认假定这个密钥会被放在文件夹下。三使用管理项目版本使用可以对我们的代码进行版本控制,如果万一误删了代码想回到之前的情况,则可以通过版本控制进行回滚。配置选项代表对进行全局设置。 laravel学习笔记,重新梳理知识点。 一、环境配置 1、编辑器选用 Atom PHPStorm SublimeText Atom 是由 GitHub 官方在 201...

    Galence 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<