用laravel4.2实现一个简单的图片墙博客(二)模型建立+数据填充

本人也算新手,高手请多多批评指正~~

在上一节中,我们完成了对数据库创建,现在已经有了网页所需的数据库表了,接下来我觉得要开始设计:怎么往数据库放数据以及怎样填充初始数据了。

MVC的第一项叫做MODEL。如何实现model?

Laravel 自带的 Eloquent ORM 为数据库提供了一个优雅的、简单的 ActiveRecord 实现。每一个数据库的表有一个对应的 "Model" 用来与这张表交互。在开始之前,确认已在 app/config/database.php 文件中配置好数据库连接。

关于MODEL部分的手册地址参看

定义一个Eloquent模型,它自动对应了该类名的小写复数形式的数据表,比如User的模型对应了users的数据表。显然,我们需要有三个名称分别为User, Picture, 和Comment的模型。

具体地,我们究竟在models中定义了什么?model有什么用?



1.模型的建立方便了数据库操作,代替了db::形式的数据表操作,用类似User::的操作,明确了所操作的表对象,操作语句简单明了。

2.模型绑定,为在路由中注入模型实例提供了便捷的途径。例如,你可以向路由中注入匹配用户ID的整个模型实例,而不是仅仅注入用户ID。这样我们从只包含ID的路由中衍生出对持有该ID的整个类的一些操作。

3.类封装了该模型的一些方法,在路由中简单引用模型和方法就能实现路由的操作,当然,不乏类内函数间的调用和更多模块化的使用。

等等还有其他各种好处。



下面列出三个模型的代码:

1#......User.php。

这里我们其实并不用指定$table,如果没有定义$table,就会默认使用小写复数形式,它就是该模型使用的表名。

有时你可能希望限制包含在模型数组或JSON中的属性,比如密码,为此,在模型中添加一个隐藏属性$hidden。

另外,我们用hasmany指定了用户和它所发的图片的一个“一对多”的关系,因此我们可以在控制器中方便地使用如User::find(1)->pictures;  快速地定位到该用户所发的所有图片,进一步,可以执行约束检索的语句,比如:User:find(1)->pictures->where('title', '=', 'foo')->first();  关系定义为关系数据库的查询提供了便利。

User模型使用了UserInterface和RemindableInterface接口,包括实现了保存用户名、密码、邮箱记录等功能。

<?php

use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableInterface;
use Illuminate\Database\Eloquent\Relations\HasMany;

class User extends Eloquent implements UserInterface, RemindableInterface {

	/**
	 * The database table used by the model.
	 *
	 * @var string
	 */
	protected $table = 'users';

	/**
	 * The attributes excluded from the model's JSON form.
	 *
	 * @var array
	 */
	protected $hidden = array('password');

	/**
	 * Get the unique identifier for the user.
	 *
	 * @return mixed
	 */
	public function getAuthIdentifier()
	{

		return $this->getKey();
	}

	/**
	 * Get the password for the user.
	 *
	 * @return string
	 */
	public function getAuthPassword()
	{
		return $this->password;
	}

	/**
	 * Get the e-mail address where password reminders are sent.
	 *
	 * @return string
	 */
	public function getReminderEmail()
	{
		return $this->email;
	}

	/**
	 * define relationship with Picture.
	 * 
	 * @return HasMany
	 */
	public function picture()
	{
		return $this->hasmany('Picture');
	}
	
	/**
	 * implement functions.
	 * unnecessary on or below laravel 4.1.
	 */
	
	/**
	 * Get the token value for the "remember me" session.
	 * 
	 * @return string
	 */
	public function getRememberToken()
	{
		return $this->remember_token;
	}
	
	/**
	 * Set the token value for the "remember me" session.
	 * 
	 * @void
	 */
	public function setRememberToken($value)
	{
		$this->remember_token = $value;
	}
	
	/**
	 * Get the column name for the "remember me" token.
	 * 
	 * @return string
	 */
	public function getRememberTokenName()
	{
		return 'remember_token';
	}
}


2#......Picture.php

Picture定义了和Comment的一对多关系以及和User的多对一关系。

$fillable定义了该模型的可集体赋值的字段。当创建一个新的模型,您可以传递属性的数组到模型的构造函数。这些属性将通过集体赋值分配给模型。这是很方便的,但把用户的输入盲目地传给模型可能是一个严重的安全问题。如果把用户输入盲目地传递给模型,用户可以自由地修改任何或者全部模型的属性。基于这个原因,默认情况下所有 Eloquent 模型将防止集体赋值。

为了实现Picture的删除功能,完成delete函数,其中先要删除它所对应的comments再删除它本身。

<?php

class Picture extends Eloquent
{

    protected $fillable = ['title', 'description', 'image'];

    public function comments()
    {
        return $this->hasMany('Comment');
    }
	
    public function user()
    {
    	return $this->belongsto('User');
    }
    public function delete()
    {
        foreach ($this->comments as $comment) {
            $comment->delete();
        }
        return parent::delete();
    }

}

3#......Comment.php

定义了和Picture的多对一关系,可集体赋值字段。

<?php

class Comment extends Eloquent
{

    protected $fillable = ['commenter', 'email', 'comment'];

    public function picture()
    {
        return $this->belongsTo('Picture');
    }


}

现在,我们已经完成了模型部分的定义,为了配合需求需要制定更多更复杂的模型操作时,可以在这里添加需要的定义。具体如何使用models中的模型,要等到介绍完控制器(controller)之后才能进一步了解。但是接下来,我们先进行数据表初始数据的填充工作,把数据库的初始工作先全部做完。

数据表的填充和表创建一样,也是由laravel的artisan命令执行的,具体参见迁移 & 数据填充

下面我们来实现数据填充的php文件

#......DatabaseSeeder.php

unguard()的功能参见注释。

这个文件是所有数据填充文件的入口,用它调用了UserTableSeeder.php文件的关于users数据表填充的相关内容,当然,如果想填充其他数据表,只要在该目录下定义并实现一个php文件,然后在这里call一下就可以了,当填充完成后,调用->command->info()输出成功信息。

<?php

class DatabaseSeeder extends Seeder {

	/**
	 * Run the database seeds.
	 *
	 * @return void
	 */
	public function run()
	{
		/**
		 * Disable all mass assignable restrictions.
		 */
		Eloquent::unguard();

		$this->call('UserTableSeeder');
		
		$this->command->info('User table seeded!');
	}

}

那么我们来看看UserTableSeeder里究竟做了什么:

#......UserTableSeeder.php

在这里,我们定义了一个由数据表属性和值构成的键值对数组$user,把它填充到数据表中,这样我们就在users数据表中新增了一个用户,账号和密码均为admin。如果发现定义有误或者像重新定义,只要去掉语句 “DB::table('user')->truncate();” 前的注释再运行就可以了。

<?php

class UserTableSeeder extends Seeder
{

    public function run()
    {
        // Uncomment the below to wipe the table clean before populating
        // DB::table('user')->truncate();

        $user = array(
            'username' => 'admin',
            'password' => Hash::make('admin'),
            'created_at' => DB::raw('NOW()'),
            'updated_at' => DB::raw('NOW()'),
        );

        // Uncomment the below to run the seeder
        DB::table('users')->insert($user);
    }

}

完成上述文件之后,在命令行输入运行:

php artisan db:seed
这样就完成了 对数据表的初始填充。查看MySQL数据库,我们会发现users表中出现了我们添加的新用户。其中的密码被加密了(使用了Hash:make()算法)。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值