二、MVC 中的模型

在这一章中,我们将讨论什么是 MVC 结构中的模型,它的目的是什么,它在 SOLID 设计模式中的作用是什么,Laravel 如何定义它,以及 Laravel 的模型层和雄辩 ORM 的优势。我们还将讨论与处理数据相关的 Laravel 类。

以下是本章将涵盖的主题列表:

  • 模型的意义
  • 模型在实体 MVC 设计模式中的作用
  • 模型和模型实例
  • 拉威尔如何定义模型
  • Laravel 的数据库相关类

什么是模型?

模型是模型-视图-控制器设计模式的一部分,我们可以简单地描述为处理数据管理的设计模式层,数据从相应的层接收,然后发送回这些层。这里需要注意的一点是,模型不知道数据来自哪里以及如何接收。

简单地说,我们可以说模型实现了应用的业务逻辑。模型负责获取数据,并将其转换为更有意义的数据,这些数据可以由应用的其他层管理,并将其发送回相应的层。模型是应用的域层或业务层的另一个名称。

What is a Model?

模型的目的

应用中的模型管理所有的动态数据(任何没有硬编码并且来自数据库驱动程序的数据),并让应用的其他相关组件知道这些变化。例如,假设您的数据库中有一篇新闻文章。如果您从数据库中手动更改它,当调用路由时,并且由于这个请求,控制器在来自路由处理程序的请求之后通过模型请求数据,并且控制器从模型接收更新的数据。因此,它会将这些更新的数据发送到视图,最终用户会从响应中看到更改。所有这些与数据相关的交互都是模型的任务。模型处理的这些“数据”不一定总是与数据库相关的。在一些实现中,模型还可以用来处理一些临时会话变量。

通用 MVC 模式中模型的基本目的如下:

  • 使用指定的(数据库)驱动程序获取数据
  • 验证数据
  • 存储数据
  • 更新数据
  • 删除数据
  • 创建条件关系
  • 监控文件输入/输出
  • 与第三方 web 服务交互
  • 处理缓存和会话

如您所见,如果您始终遵循 MVC 模式,那么模型将覆盖应用逻辑的很大一部分。在现代框架中,用户在学习设计模式时会犯一个关于模型的常见错误。他们通常会混淆模型和模型实例。虽然它们很相似,但它们有不同的含义。

模型实例

在您的应用中,通常会有多个数据结构需要管理。例如,假设你在经营一个博客。在一个简单的博客系统中,有作者、博客文章、标签和评论。假设你想更新一篇博文;你如何定义你想要更新的数据是用于博客文章的?这就是模型实例派上用场的地方。

模型实例是简单的类,主要从应用的模型层扩展而来。这些实例将应用每个部分的数据逻辑分开。在我们的例子中,我们有四个部分要处理(用户、帖子、标签和评论)。如果我们要使用模型来处理这些,我们必须创建至少四个实例(我们将在本章雄辩表单下的关系部分介绍为什么它至少是四个而不是正好是四个)。

Model instances

从图中可以看到,控制器与模型实例交互来获取数据。由于模型实例是从模型本身扩展而来的,而不是原始的模型输出,因此控制器可以对其进行定制,或者向流程中添加其他层(如验证)。

假设你想获取拥有用户名George的用户。如果没有从模型实例向数据库添加验证层,username参数将直接进入数据库,这可能是有害的。如果您确实在模型实例上添加了验证层(检查用户名参数是否是干净的字符串),即使该参数是 SQL 注入代码,它也将首先被验证层过滤,而不是直接进入数据库,然后被检测为有害代码。然后,模型实例将向控制器返回参数无效的消息或异常。然后,控制器将向视图发送相应的消息,并从那里向最终用户显示该消息。在这个过程中,应用甚至可以触发一个事件来记录这一尝试。

Laravel 的模型

如果你还记得,我们在本章前面提到,模型需要处理很多重要的工作。Laravel 4 没有直接使用 MVC 模式,但它进一步扩展了该模式。例如,验证——它是实体 MVC 模式中模型的一部分——有自己的类,但它不是模型本身的一部分。数据库连接层对于每个数据库驱动程序都有自己的类,但是它们并不直接打包在模型中。这给模型带来了可测试性、模块化和可扩展性。

Laravel 模型结构更侧重于直接的数据库进程,它与其他目的是分开的。其他目的被归类为门面。

为了访问数据库,Laravel 有两个类。第一个是流畅的查询生成器,第二个是雄辩的 ORM。

流畅的查询生成器

Fluent 是 Laravel 4 的查询生成器类。流畅的查询构建器在后端使用 PHP 数据对象处理基本数据库查询操作,它可以与几乎任何数据库驱动程序一起使用。假设您需要将数据库驱动程序从 SQLite 更改为 MySQL 如果您已经使用 Fluent 编写了查询,那么您通常不需要重写或更改代码,除非您已经使用DB::raw()编写了原始查询。Fluent 在幕后处理这个问题。

让我们快速了解一下 Laravel 4 的雄辩模型(可在Vendor\Laravel\Framework\src\Illuminate\Database\Query文件夹中找到):

<?php namespace Illuminate\Database\Query;

use Closure;
use Illuminate\Support\Collection;
use Illuminate\Database\ConnectionInterface;
use Illuminate\Database\Query\Grammars\Grammar;
use Illuminate\Database\Query\Processors\Processor;

class Builder {
    //methods and variables come here
}

如您所见,雄辩模型使用了一些类,如DatabaseConnectionInterfaceCollectionGrammarProcessor。所有这些都是标准化后端数据库查询、缓存查询(如果需要)以及将输出作为集合对象返回所必需的。

以下是一些基本示例,展示了查询的外观:

  • To get all of the names and show them one by one from a users table, use the following code:

    php $users = DB::table('users')->get(); foreach ($users as $user) { var_dump($user->name); }

    get()方法以集合的形式从表中获取所有记录。通过foreach()循环,记录被循环,然后我们使用->name(一个对象)访问每个名称列。如果我们要访问的列是电子邮件,那么它看起来像$user->email

  • To fetch the first user named Arda from the users table, use the following code:

    php $user = DB::table('users')->where('name', 'Arda')->first(); var_dump($user->name);

    where()方法用给定的参数过滤查询。first()方法直接从第一个匹配的元素返回单个项目的集合对象。如果有两个名为Arda的用户,只有第一个会被捕获并设置为$user变量。

  • 如果您想在where子句中使用OR语句,您可以使用以下代码:

    php $user = DB::table('users') ->where('name', 'Arda') ->orWhere('name', 'Ibrahim') ->first(); var_dump($user->name);

  • 要在where子句中使用运算符,应在列名和要过滤的变量之间添加以下第三个参数:

    php $user = DB::table('users')->where('id', '>', '2')->get(); foreach ($users as $user) { var_dump($user->email); }

  • If you are using offsets and limits, execute the following query:

    php $users = DB::table('users')->skip(10)->take(5)->get();

    这就在 MySQL 中产生了SELECT * FROM用户LIMIT 10,5skip($integer)方法将为查询设置一个偏移量,take($ integer)将通过已设置为参数的自然数限制输出。

  • You can also limit what is to be fetched using the select() method and use the following join statements easily in Fluent Query Builder:

    php DB::table('users') ->join('contacts', 'users.id', '=', 'contacts.user_id') ->join('orders', 'users.id', '=', 'orders.user_id') ->select('users.id', 'contacts.phone', 'orders.price');

    这些方法只需将users表与联系人连接,然后将订单与用户连接,然后从contacts表中获取用户 ID、电话列,从orders表中获取价格列。

  • You can group queries by parameters easily, using closure functions. This will allow you to write more complicated queries with ease, as follows:

    php DB::table('users') ->where('name', '=', 'John') ->orWhere(function($query) { $query->where('votes', '>', 100) ->where('title', '<>', 'Admin'); }) ->get();

    这将生成以下 SQL 查询:

    php select * from users where name = 'John' or (votes > 100 and title <> 'Admin')

  • 也可以在查询生成器中使用聚合(如countmaxminavgsum),如下所示:

    php $users = DB::table('users')->count(); $price = DB::table('orders')->max('price');

  • 有时,这样的构建器可能还不够,或者您可能想要运行原始查询。您也可以将原始查询包装在 Fluent 中,如下所示:

    php $users = DB::table('users') ->select( array( DB::raw('count(*) as user_count'), 'status', ) ) ->where('status', '<>', 1) ->groupBy('status') ->get();

  • 要在表格中插入新数据,使用insert()方法:

    php DB::table('users')->insert( array('email' => 'me@ardakilicdagi.com', 'points' => 100) );

  • 要更新表格中的行,请使用update()方法:

    php DB::table('users') ->where('id', 1) ->update(array('votes' => 100));

  • 要从表格中删除一行,使用delete()方法:

    php DB::table('users') ->where('last_login', '2013-01-01 00:00:00') ->delete();

  • Benefiting of CachingIterator that's used the Collection class, Fluent Query Builder can also cache results upon calling using the method remember() :

    php $user = DB::table('users') ->where('name', 'Arda') ->remember(10) ->first();

    这个查询被调用一次后,会被缓存 10 分钟;如果再次调用这个查询,而不是从数据库中获取,它将直接从缓存中获取,直到 10 分钟过去。

雄辩的 ORM

雄辩表单是 Laravel 中的活动记录实现。它简单、强大、并且易于处理和管理。

对于每个数据库表,您需要一个新的模型实例来受益于雄辩。

假设你有一张posts桌,你想从雄辩中获益;您需要导航到app/models并将该文件保存为Post.php(表格名称的单数形式):

<?php class Post extends Eloquent {}

就这样!您已经准备好从餐桌上雄辩的方法中获益。

Laravel 允许您将任何表分配给任何有说服力的模型实例。没有必要,但是用对应表的单数名称来命名模型实例是一个好习惯。该名称应该是它所代表的表名的单数形式。如果必须使用不遵循此一般规则的名称,可以通过在模型实例内部设置受保护的$table变量来实现。

<?php Class Post Extends Eloquent {

   protected $table = 'my_uber_posts_table';

}

这样,您可以将表分配给任何所需的模型实例。

没有必要将实例添加到app中的models文件夹中。只要你在composer.json中设置了autoload路径,你就可以完全摆脱这个文件夹,把它添加到你喜欢的任何地方。这将在编程过程中为您的架构带来灵活性。

让我们快速看一下我们刚刚扩展的 Laravel 4 的以下Model类(在Vendor\Laravel\Framework\src\Illuminate\Database\Eloquent文件夹中):

<?php namespace Illuminate\Database\Eloquent;

use DateTime;
use ArrayAccess;
use Carbon\Carbon;
use LogicException;
use JsonSerializable;
use Illuminate\Events\Dispatcher;
use Illuminate\Database\Eloquent\Relations\Pivot;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Support\Contracts\JsonableInterface;
use Illuminate\Support\Contracts\ArrayableInterface;
use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Database\Eloquent\Relations\MorphOne;
use Illuminate\Database\Eloquent\Relations\MorphMany;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Query\Builder as QueryBuilder;
use Illuminate\Database\Eloquent\Relations\MorphToMany;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasManyThrough;
use Illuminate\Database\ConnectionResolverInterface as Resolver;

abstract class Model implements ArrayAccess, ArrayableInterface, JsonableInterface, JsonSerializable {
   //Methods and variables come here
}

雄辩使用Illuminate\Database\Query\Builder,这是我们前面描述的流畅查询生成器,它的方法是在里面定义的。感谢这一点,所有可以在 Fluent 查询生成器中定义的方法也可以在 ORM 中使用。

正如您所看到的,所有使用的类都是根据它们的用途来划分的。这为架构带来了更好的 抽象可重用性

关系

除了流畅的查询生成器之外,雄辩的 ORM 还有其他的优势。主要的好处是模型实例关系,它允许流畅的查询生成器轻松地与其他模型实例形成关系。假设你有usersposts表,你想得到一个 ID 为5的用户发的帖子。设置好关系后,可以用下面的代码轻松地获取这些帖子的集合:

User::find(5)->posts;

这再容易不过了,是吗?有三种主要的关系类型:一对一、一对多和多对多。除此之外,Laravel 4 还具有多对多和变形对多(多对多多态)关系:

  • 一对一关系:当两款车型只有一个元素时,使用这些。假设你有一个User模型,在你的Phone模型中应该只有一个元素。在这种情况下,关系将被定义如下:

    ```php //User.php model Class User Extends Eloquent {

    public function phone() { return $this->hasOne('Phone'); //Phone is the name of Model Instance here, not a table or column name }

    }

    //Phone.php model Class Phone Extends Eloquent {

    public function user() { return $this->hasOne('User'); }

    } ```

  • 一对多关系:当一个模型有多个另一个模型的元素时,使用这些。假设你有一个分类的新闻系统。一个类别可以有多个项目。在这种情况下,关系将被定义如下:

    ```php //Category.php model class Category extends Eloquent {

    public function news() { return $this->hasMany('News'); //News is the name of Model Instance here }

    }

    //News.php model class News extends Eloquent {

    public function categories() { return $this->belongsTo('Category'); }

    } ```

  • Many-to-many relationships : These are used when two Models have more than one element of each other. Let's say you have Blog and Tag Models. A blog post might have more than one tag, and a tag might be assigned to more than one blog post. For such instances, a pivot table is used along with Many to Many Relationships. The relationship can be defined as follows:

    ```php //Blog.php Model Class Blog Extends Eloquent {

    public function tags() { return $this->belongsToMany('Tag', 'blog_tag'); //blog_tag is the name of the pivot table }

    }

    //Tag.php model Class Tag Extends Eloquent {

    public function blogs() { return $this->belongsToMany('Blog', 'blog_tag'); }

    } ```

    Laravel 4 为这些已知的关系增加了一些灵活性和额外的关系。它们是“多对多”和“多态关系”。

  • 拥有多种关系:这些更像是捷径。假设你有一个Country模型、User模型和Post模型。一个国家可能有多个用户,和一个用户可能有多个帖子。如果想要访问特定国家的用户创建的所有帖子,需要定义如下关系:

    ```php //Country.php Model Class Country Extends Eloquent {

    public function posts() { return $this->hasManyThrough('Post', 'User'); }

    } ```

  • Polymorphic relationships : These are featured in Laravel v4.1. Let's say you have a News Model, Blog Model, and Photo Model. This Photo Model holds images for both News and Blog , but how do you relate this or identify a specific photo that is either for blogs or posts? This can be done easily. It needs to be set as follows:

    ```php //Photo.php Model Class Photo Extends Eloquent {

    public function imageable() { return $this->morphTo(); //This method doesn't take any parameters, Eloquent will understand what will be morphed by calling this method }

    }

    //News.php Model Class News Extends Eloquent {

    public function photos() { return $this->morphMany('Photo', 'imageable'); }

    }

    //Blog.php Model Class Blog Extends Eloquent {

    public function photos() { return $this->morphMany('Photo', 'imageable'); }

    } ```

    描述图像所有者的关键字imageable不是必须的;它可以是任何东西,但是您需要将其设置为方法名,并将其作为第二个参数放入morphMany关系定义中。这个帮助我们了解如何访问照片的所有者。这样的话,我们可以从Photo模型中很容易地称之为这个,而不需要了解它的主人是Blog还是News:

    php $photo = Photo::find(1); $owner = $photo->imageable; //This brings either a blog collection or News according to its owner.

在本例中,您需要向Photo模型的表中添加两个额外的列。这些列是imageable_idimageable_typeimageable部分是变形方法的名称,后缀的标识和类型是定义它将被变形的项目的确切标识和类型的键。

批量分配

当创建新的模型实例时(当插入或更新数据时),我们传递一个变量,该变量被设置为具有属性名称和值的数组。然后通过批量分配将这些属性分配给模型。如果我们盲目地将所有的输入都加入到批量分配中,这将成为一个严重的安全问题。除了查询方法之外,雄辩的 ORM 还帮助我们进行批量分配。假设您不希望您的User型号(Object)中的列电子邮件以任何方式被更改(黑名单),或者您只希望您的Post型号(白名单)中的标题和正文列被更改。这可以通过在模型中设置受保护的$fillable$guarded变量来实现:

//User.php model
Class User Extends Eloquent {
   //Disable the mass assignment of the column email 
   protected $guarded = array('email');

}

//Blog.php model
Class User Extends Eloquent {
   //Only allow title and body columns to be mass assigned
   protected $fillable = array('title', 'body');

}

软删除

假设你有一个posts表,假设这个表里面的数据很重要。即使从模型中运行delete命令,您也希望将删除的数据保留在数据库中,以防万一。在这种情况下,您可以对 Laravel 使用软删除。

软删除实际上并没有从表中删除该行;相反,如果数据被实际删除,它会添加一个键。当进行软删除时,一个名为deleted_at的新列会填充时间戳。

要启用软删除,您需要首先将名为deleted_at的时间戳列添加到您的表中(您可以通过将$table->softDeletes()添加到您的迁移中来实现),然后在模型实例中将名为$softDelete的变量设置为true

以下是软删除的模型实例示例:

//Post.php model
Class Post Extends Eloquent {
   //Allow Soft Deletes
   protected $softDelete = true;

}

现在,当您在这个模型中运行delete()方法时,它将向其中添加一个deleted_at时间戳,而不是实际删除该列。

现在,当您运行all()get()方法时,软删除的列不会被列出,就像它们实际上已经被删除了一样。

在这样的删除之后,您可能希望得到与软删除的行一起的结果。为此,使用如下withTrashed()方法:

$allPosts = Post::withTrashed()->get(); //These results will include both soft-deleted and non-soft-deleted posts.

在某些情况下,您可能希望只提取软删除的行。为此,使用如下onlyTrashed()方法:

$onlySoftDeletedPosts = Post::onlyTrashed()->get();

要恢复软删除的行,请使用restore()方法。要恢复所有软删除的帖子,运行如下代码:

$restoreAllSoftDeletedPosts = Post::onlyTrashed()->restore();

要从表中硬删除(完全删除)软删除的行,使用如下forceDelete()方法:

$forceDeleteSoftDeletedPosts = Post::onlyTrashed()->forceDelete();

从表中提取行时(包括软删除),您可能需要检查它们是否已被软删除。该检查通过对收集行运行trashed()方法来完成。此方法将返回一个布尔值。如果为真,则表示该行已被软删除。

//Let's fetch a post without the soft-delete checking:
$post = Post::withTrashed()->find(1);
//Then let's check whether it's soft deleted or now if($post->trashed()) {
return 'This post is soft-deleted'; } else {
   return 'This post is not soft-deleted';
}

急装

雄辩的 ORM 也为 N+1 查询问题带来了一个简洁的解决方案急切加载。让我们假设您有一个如下所示的查询和循环:

$blogs = Blog::all();
foreach($blogs as $blog) {
   var_dump($blog->images());
}

在这种情况下,为了访问图像,对后端的每个循环再执行一次查询。这将彻底耗尽数据库,因此为了防止这种情况,我们将在查询中使用with()方法。这将获取所有的博客和图片,在后端将它们关联起来,并直接作为一个集合。参考以下代码:

$blogs = Blog::with('images')->get();
foreach($blogs as $blog) {
   var_dump($blog->images);
}

这样,查询会更快,使用的资源也会更少。

时间戳

当您将$timestamps设置为true时(这是默认设置),可以看到雄辩 ORM 的主要优势;你会有两列,第一列是created_at,第二列是updated_at。这两列将数据的创建时间和上次更新时间保留为时间戳,并在每行创建或更新时自动更新它们。

查询范围

假设你重复一个where条件几次,因为是你的申请中常用的从句,这个条件意味着什么。假设你想获得所有浏览量超过 100 的博客文章(我们称之为热门文章)。不使用范围,你会得到以下格式的帖子:

$popularBlogPosts = Blog::where('views', '>', '100')->get();

但是,在示例中,您将在应用中一遍又一遍地重复这个过程。那么,为什么不把它设置为一个范围呢?您可以使用 Laravel 的查询范围功能轻松做到这一点。

将以下代码添加到您的Blog模型中:

public function scopePopular($query) {
   return $query->where('views', '>', '100');
}

完成此操作后,您可以使用以下代码轻松使用您的范围:

$popularBlogPosts = Blog::popular()->get();

您也可以如下链接帖子:

$popularBlogPosts = Blog::recent()->popular()->get();

存取器和变异器

雄辩表单的一个特点是访问器和变异器。假设您的表上有一个名为name的列,在调用这个列时,您希望通过 PHP 的ucfirst()方法将其名称大写。这可以通过简单地将以下代码行添加到模型中来实现:

public function getNameAttribute($value) {
    return ucfirst($value);
}

现在,让我们考虑相反的情况。每次保存或更新名称列时,都希望将 PHP strtolower()函数传递给该列(希望对输入进行变异)。这可以通过向模型中添加以下代码行来实现:

public function setNameAttribute($value) {
    return strtolower($value);
}

请注意,即使列名是snake_cased,方法名也应该是 CamelCased。如果你的列名是first_name,那么 getter 方法名应该是getFirstNameAttribute

模型事件

模型事件在 Laravel 设计模式中起着重要的作用。使用模型事件,您可以在事件触发后立即调用任何方法。

假设您已经为评论设置了缓存,并且希望每次删除评论时都刷新缓存。怎么才能抓住评论的删除事件,在那里做点什么?应用中是否应该有各种地方可以删除此类评论?有没有办法捕捉确切的“删除”或“已删除”事件?在这种情况下,模型事件就派上了用场。

车型采用以下方式:creatingcreatedupdatingupdatedsavingsaveddeletingdeletedrestoringrestored

每当第一次保存新项目时,都会触发创建和已创建事件。如果您正在更新模型上的当前项目,将会触发updating / updated事件。无论您是创建新项目还是更新当前项目,都会触发saving / saved事件。

如果false是从creatingupdatingsavingdeleting事件返回的,则该动作将被取消。

例如,让我们检查用户是否已创建。如果它的名字是Hybrid,我们就取消创作。要添加此条件,请在您的User模型中包含以下代码行:

User::creating(function($user){
    if ($user->first_name == 'Hybrid') return false;
});

模型观察者

模型观察者与模型事件非常相似,但方法略有不同。它不是定义模型内部的所有事件(creatingcreatedupdatingupdatedsavingsaveddeletingdeletedrestoringrestored),而是将事件的逻辑“抽象”到不同的类,并用observe()方法“观察”。假设我们有一个如下所示的模型事件:

User::creating(function($user){
    if ($user->first_name == 'Hybrid') return false;
});

为了保持抽象,最好包装所有这些事件,并将它们的逻辑从模型中分离出来。在观察者看来,这些事件如下所示:

class UserObserver {

   public function creating($model){
       if ($model->first_name == 'Hybrid') return false;
    }

    public function saving($model)
    {
        //Another model event action here
    }

}

可以想象,您可以将这个类放在应用的任何地方。您甚至可以将所有这些事件分组到一个单独的文件夹中,以获得更好的架构模式。

现在,您需要将此事件Observer类注册到模型。这可以通过以下简单命令来完成:

User::observe(new UserObserver);

这种方法的主要优势是您可以在多个模型中使用观察器,并以这种方式向一个模型注册多个观察器。

迁徙

迁移是控制数据库版本的简单工具。假设有一个地方,您需要向表中添加一个新列,或者回滚到以前的状态,因为您做错了什么或者到应用的链接断开了。没有迁移,这些都是繁琐的任务,但有了迁移,您的生活会轻松得多。

使用迁移有多种原因;其中一些如下:

  • 您将从这个版本控制系统中受益。如果您犯了一个错误或需要回滚到以前的状态,您可以使用迁移仅使用一个命令来完成。
  • 将迁移用于变更将带来灵活性。所编写的迁移将适用于所有受支持的数据库驱动程序,因此您不需要为不同的驱动程序一次又一次地重写数据库代码。Laravel 将在后台处理此事。
  • 它们很容易生成。使用名为artisan的 Laravel php客户端的迁移命令,您可以管理应用的所有迁移。

以下是迁移文件的样子:

<?php

use Illuminate\Database\Migrations\Migration;

class CreateNewsTable extends Migration {

        /**
        * Run the migrations.
        */
        public function up()
        {
                //
        }

        /**
        * Reverse the migrations.
        */
        public function down()
        {
                //
        }

}

当迁移向前运行(新的迁移)时,up()方法运行。down()方法在迁移向后运行时运行,这意味着它反转或重置(反转并重新运行)迁移。

通过artisan命令触发这些方法后,向上或向下运行该方法,对应artisan命令的参数,并返回消息的状态。

数据库播种器

假设您已经编写了一个博客应用。你需要展示它的能力,但是没有示例博客文章来展示你设计的超棒的博客。这就是播种机派上用场的地方。

数据库播种器是一些简单的类,它们在指定的表中填充随机数据。播种机类有一个简单的方法叫做run()来播种。以下是播种机的外观:

<?php

class BlogTableSeeder extends Seeder {

  public function run()
  {
    DB::table('blogs')->insert(array(
      array('title' => 'My Title'),
      array('title' => 'My Second Title'),
      array('title' => 'My Third Title')
    ));
  }

}

当您使用artisan命令从终端调用这个类时,它会连接到数据库并用给定的数据填充它。在这一尝试之后,它通过终端向用户返回关于播种状态的命令消息。

类型

下载示例代码

您可以从您在http://www.packtpub.com的账户中下载您购买的所有 Packt 书籍的示例代码文件。如果您在其他地方购买了这本书,您可以访问http://www.packtpub.com/support并注册,以便将文件直接通过电子邮件发送给您。

总结

在本章中,我们已经了解了模型在 MVC 模式中的角色,以及 Laravel 4 如何通过将其角色扩展到各种类来“定义”模型。我们还通过示例看到了 Laravel 4 的 Model 组件的功能。

在下一章中,我们将了解视图的角色,以及它如何使用 Laravel 4 上的 MVC 模式与最终用户和应用的其他方面进行交互。