1、构造模拟数据包:fzaninotto/faker (Faker is a PHP library that generates fake data for you)
Packgist地址(faker详细说明文档): https://packagist.org/packages/fzaninotto/faker
Laravel5.1中已经安装了:/vendor/fzaninotto/faker
为了自动化生成migration、seeder等,安装一个laracasts/generators(针对laravel5.*),安装方式:https://packagist.org/packages/laracasts/generators
laravel4.*安装方式:https://packagist.org/packages/way/generators
//Laravel插曲 Start//
/Laravel Database Module///
//Laravel数据库模块支持MySQL连接,并且有时需要一个connection支持SELECT事务操作,另一个connection支持INSERT/UPDATE/DELETE等事务操作,可以这样去配置(见Laravel中文版第三方网:Laravel中文第三方网)
//例如读写分离:
'mysql'=>[
'read'=>[
'host'=>'192.168.1.1',
],
'write'=>[
'host'=>'192.168.1.2',
],
'driver'=>'mysql',
'database'=>'database',
'username'=>'root',
'password'=>'root',
'charset'=>'utf-8',
'collation'=>'utf8_unicode_ci',
'prefix'=>'',
],
//真的很方便
一旦和数据库连接后,可以用三种方法来执行事务操作:
(1) Raw SQL技术//原生事务操作 DB::select()/DB::insert()/DB::update()/DB::delete()/DB::statement()
Running SELECT Query
/**
*@return users list
*/
class UserController extends Controller{
public function index(){
$users = DB::select('select * from users where active= ?', [1] );
return view('user.index', ['users'=>$users]);
}
}
//select()第一个参数采用参数绑定(parameter binding),参数绑定可防止SQL injection,返回值是一个array,array中的每一个值都是StdClass Object,可遍历:
foreach($users as $user){
echo $user->name;
}
//使用命名绑定技术(named binding)
$users = DB::select('select * from users where id=:id', ['id'=>1]);//这个技术觉得不错
Running INSERT Query
//insert 事务,第一个参数还是Raw Query,第二个参数还是参数绑定技术,没有返回值。
DB::insert('insert into users(id, name) values (?,?)', ['1', 'Laravel']);
Running Update Query
//update事务,第一个参数还是Raw Query,第二个参数还是参数绑定技术,返回值是被受影响的number of rows,觉得返回值可作为检查使用。
$affects = DB::update('update users set vote=100 where name=?',['Laravel']);
Running Delete Query
//delete直接删除掉表或者一些表中的脏数据,仅有一个参数就是Raw Query,返回值还是受影响的number of rows。
$affects = DB::delete('delete from users');
Running General Statement
//一般性事务,没有返回值
DB::statement('drop table users');
监听数据库操作事务(Listening For Query Events)
//目的是为了Logging你的query事务,为了Debugging,使用listen()技术来实现
为了实现query listener,需要在AppServiceProvider中注册下
class AppServiceProvider extends ServiceProvider{
/**
*bootstrap any application service
*/
public function boot(){
DB::listen(function($sql, $bindings, $time){//使用匿名函数技术,下次试试这个技术
// to do
});
}
/**
*register service provider
*/
public function register(){
}
}
Database Transactions
//当执行事务集合操作时,使用Transaction技术。当有exception抛出时,关闭会话(Closure Transaction)捕获并transaction自动回滚(roll back),Closure执行顺利则会话顺利提交。
DB::transation(function(){
DB::table('users')->update(['votes'=>'1']);
DB::table('posts')->delete();
});
Using Multiple Database Connections
//使用多个数据库连接技术。//后续再完善
(2) Query Builder 查询构造器技术
//不同于Raw SQL 技术,Query Builder技术使用PDO参数绑定技术可有效保护SQL Injection。
Retrieving Results查询结果集
//使用table()方法,该方法返回query builder instance, 可以利用这个instance来实现链式事务操作,很棒的技术
比如从一个users表中获得所有user:
class UserController extends Controller{
/**
*同样还是返回users表的所有user,比较Raw SQL的直接select()技术,还是table()技术牛逼
*/
public function index(){
$users = DB::table('users')->get();
return view('user.index', ['users'=>$users]);
}
}
同样可以对返回值$users做遍历,因为它还是StdClass Object:
foreach($users as $user){
echo $user->name;
}
Retrieving a Row/Column From a Table 取一个行或列
从表users中取name=Laravel一行的值:
class UserController extends Controller{
/**
*同样还是返回users表的所有user,比较Raw SQL的直接select()技术,还是table()技术牛逼
*/
public function index(){
$user = DB::table('users')->where('name','Laravel')->first();//取一整行的值
return view('user.index', ['user'=>$user]);
}
}
如果取一行的value=email的值,可以这样:
$email = DB::table('users')->where('name','Laravel')->value('email');//取name=laravel的它的email值
取一整列column = title的值:
class UserController extends Controller{
/**
*同样还是返回users表的所有user,比较Raw SQL的直接select()技术,还是table()技术牛逼
*/
public function index(){
$titles = DB::table('users')->lists('titles');//返回一整列title的值
//$titles = DB::table('users')->lists('titles','laravel');//返回titles列中值为laravel的值组成的数组
//foreach($titles as $title){
//echo $title;
//}
return view('user.index', ['titles'=>$titles]);
}
}
Chunking Results From a Table //待完善,先挖这个坑
//官网上说从一个表中一次性取“一坨”results,能干啥呢?
Aggregate 计数器技术
//Query Builder也提供了一些计数技术:count, max, min, avg, sum
$users_count = DB::table('users')->count();//返回表users中user个数
$price = DB::table('orders')->max('price');//返回订单中price最大值
$price = DB::table('orders')->where('fruit','laravel')->avg('price');//返回水果得是laravel的一堆价格的平均值
Query Builder 的 Select技术
//构造一个custom query
$users = DB::table('users')->select('name', 'laravel')->get();//查找name=laravel的users
//返回没有重复的值
$users = DB::table('users')->distinct()->get();
//想要在一个已经有了select的限制条件中继续增加限制,用addSelect()方法
$query = DB::table('users')->select('name');
$users = $query->addSelect('age')->get();
Query Builder的Join技术
Inner Join内连接技术,不错的技术
$users = DB::table('users')
->join('contacts', 'users.id', '=', 'contacts.user_id')
->join('orders', 'users.id', '=', 'orders.user_id')
->select('users.*', 'contacts.phone', 'orders.price')
->get();
Left Join 左连接技术
$users = DB::table('users')
->leftJoin('posts', 'users.id', '=', 'posts.user_id')
->get();
Query Builder 的Unions 合并查询语句技术
$first_query = DB::table('users')->whereNull('first_name');
$users = DB::table('users')->whereNull('last_name')->union($first_query)->get();
Query Builder 的Where 限制条件技术
$users = DB::table('users')->where('name', '=', 'laravel')->get();//第一个参数是限定的column,第二个参数是操作符operator,第三个参数是限定的column value
$users = DB::table('users')->where('name', 'laravel')->get();//'='操作符可以缺省
$users = DB::table('users')->where('votes', '>=', '100')->get();
$users = DB::table('users')->where('votes', '<>', '100')->get();
$users = DB::table('users')->where('name', 'like', 'T%');
$users = DB::table('users')->where('votes', '>', '100')
->orWhere('name', 'laravel')//或者另一个限定条件
->get();
$users = DB::table('users')->whereBetween('votes',[1,100])->get();
$users = DB::table('users')->whereNotBetween('votes', [1,100])->get();
$users = DB::table('users')->whereIn('id', [1,2,3])->get();
$users = DB::table('users')->whereNotIn('id', [1,2,3])->get();
$users = DB::table('users')->whereNull('votes')->get();
$users = DB::table('users')->whereNotNull('votes')->get();
//组合式where语句
$users = DB::table('users')->where('name', 'laravel')
->orWhere(function($query){
$query->where('votes', '>', '100')
->where('email','like', '@126.com');
})
->get();
//这句话等同于SQL语句:select * from users where name='laravel' or where (votes>100 and email like '@126.com');
Query Builder 的Ordering, Grouping, Limit, &Offset技术
//orderBy()排序技术
$users = DB::table('users')->orderBy('name', 'desc')->get();//升序asc和降序desc
//groupBy()和having()技术
$users = DB::table('users')->groupBy('account')->having('account', '>', '100')->get();//having与where语句类似
Query Builder 的Insert插入技术
//可以插入一个数组格式的数据
DB::table('users')->insert([
['name'=>'laravel', 'gender'=>'male'],
['name'=>'PHP', 'gender'=>'female']
]);
Query Builder 的Update数据更新技术
DB::table('users')->where('id', '=', '1')->update([
['name'=>'laravel', 'phone'=>'123456'],
['name'=>'php', 'phone'=>'234567']
]);
DB::table('users')->increment('money');
DB::table('users')->increment('money', 5);
DB::table('users')->decrement('money');
DB::table('users')->decrement('money', 5);
//增加限制条件
DB::table('users')->increment('money',5,['name'=>'laravel']);
Query Builder 的Delete数据删除技术
DB::table('users')->delete();//删除表的records
DB::table('users')->where('votes', '>', '100')->delete();
DB::table('users')->truncate();//删除整个表的内容
(3) Eloquent ORM技术
Eloquent ORM 是一个优美简洁的 ActiveRecord 实现,用来实现数据库操作,每个数据库表会和一个对应的Model互动。
1、构建Model :从数据库中获取或新增数据
CLI 命令:php artisan make:model Users
class User extends Model{
protected $table = 'laravel';//不写的话,默认为类名的复数形式
public timestamps = false;//不写的话,表里有created_at和updated_at字段
}
//当Model写好后,就可在UserController中取数据了
class UserController extends Controller{
$users = User::all();//取出所有users数据
//$user = User::find(1);//根据主键取user
//$user = User::where('votes', '>', '100')->findOrFail();//Query Builder中技术可以用
//处理几百条查询结果时,使用chunk()方法
/*User::chunk('200',function($users){
foreach($users as $user){
//$user = User::where('age','18')->findOrFail();
//...
}
});*/
return view('users.index', ['users'=>$users]);//给View层显示
}
2、批量赋值
Laravel的Model默认阻止批量赋值,可以使用$fillable来指定批量赋值
class User extends Model{
protected $fillable = ['name', 'age', 'height'];
protected $guarded = ['id', 'password'];//$guarded与$fillable相反,不可以批量赋值
}
3、新增/更新一条数据到数据库
//使用模型的create()方法新增一条数据,批次的话需要设置好Model的$fillable
$user = User::create(['name'=>'laravel']);
$user = User::firstOrCreate(['name'=>'laravel']);//没有则新增,并取得新的实例
$user = User::findOrNew(['name'=>'laravel']);//没有则新建一个新的实例
//取出该条数据,再更新
$user = User::find(1);
$user->name = 'laravel';
$user->save();
//批次更新/删除,可利用Query Builder查询语句来实现
$affected_rows = User::where('age', '>', '18')->update(['account'=>'1']);
$affected_rows = User::where('age', '>', '18')->delete();
//
//待完善/
/
插曲:表结构迁移器 Migrations///
//迁移就像是数据库的版本控制,可以方便团队的修改和共享数据库结构,通常和结构构造器Schema一起使用,Laravel提供了与数据库无关的Schema的数据操作
创建迁移命令:php artisan make:migration create_users_table/add_users_table –create=users/–table=users
生成的migration文件:
class CreateUsersTable extends Migration{
//up()方法为数据库添加索引或新的数据表
public function up(){
//使用结构构造器技术Schema
Schema::create('users', function(Blueprint $table){
$table->increments('id');
$table->string('name');
$table->boolean('laravel');
$table->timestamps();
});
}
public function down(){
Schema::drop('users');
}
}
运行迁移:php artisan migrate:refresh –seed//先回滚,再迁移,最后填充。没有–seed则没有填充。
利用Schema结构生成器编写迁移表:
Schema::create('users', function(Blueprint $table){ });
Schema::connection('foo')->create('users', function(Blueprint $table){ });//连接一个非默认的数据库,在该数据库中创建表
Schema::create('users', function(Blueprint $table){
$table->$engine = 'InnoDB';
$table->increments('id');
});//为该users表修改数据库存储引擎
Schema::rename($from, $to);//修改数据表的名称
Schema::drop('users');/Schema::dropIfExists('users');//删除表
//为表创建列
//Schema创建列,Schema::create()/Schema::table()
Schema::table('users', function(Blueprint $table){
$table->increments('id');//laravel自带,创建id自增
$table->string('name');
$table->string('sex');//创建列
$table->timestamps();//创建created_at和updated_at字段,laravel自带
});
//列修饰符
$table->string('name')->nullable();//允许插入空值
->first();
->after('column');//在该列之后(只针对MySQL数据库)
->default($value);//默认值是$value
->unsigned();//指定integer整型为无符号型
//修改列
//后续完善,还没用到
//创建索引
$table->string('email')->unique();
$table->unique(['email', 'account']);//指定email值唯一,可以用数组格式
->primary(['id', 'name'])//指定主键
->index(['id', 'name']);//添加基本索引
//移除索引
$table->dropPrimary('users_id_primary');//从users表中移除id的主键索引
$table->dropUnique('users_email_unique');//从users表中移除email的唯一索引
$table->dropIndex('users_address_index');//从users表中移除address的基本索引
//外键约束
Schema::create('posts', function($table){
$table = integer('user_id')->unsigned();
$table->foreign('user_id')
->references('id')
->on('users')
->onDelete('cascade');
$table->dropForeign('posts_user_id_foreign');//删除posts表user_id的外键
});
///数据表迁移器Migration END///
///数据表填充器Seeder
利用数据填充器填充测试数据///
//使用CLI命令:php artisan make:seeder UserTableSeeder
//在DatabaseSeeder的run()中call同目录下其他的的children seeders,写好了一堆children seeders后,需要在DatabaseSeeder中call下,可以控制填充的顺序。
class DatabaseSeeder extends Seeder{
public function run(){
$this->call('UserTableSeeder');
}
}
class UserTableSeeder extends Seeder{
//child seeder
public function run(){
$faker = Faker\Factory::create();//可以利用Faker库来造数据,非常棒的一个库,可在www.packagist.org中找到
//...
}
}
//执行填充命令
php artisan db:seed --class=UserTableSeeder// 用--class参数指定要填充的Seeder
//也可以 php artisan migrate:refresh --seed//回滚,迁移,填充,一气呵成
/数据表填充器Seeder END/
/