(一) Laravel学习笔记之构造服务端API——数据填充//待完善V1.0版

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/
/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值