Laravel入门与实战示例代码----数据库和Eloquent

示例8-1 数据库默认连接列表

'connections' =>[
    'sqlite' => [
        'driver' => 'sqlite',
        'database' => database_path('database.sqlite'),
        'prefix' => '',
    ],

    'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', 'localhost'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNMAE', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'charset' => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix' => false,
        'engine' => null,
    ],

    'pgsql' => [
        'driver' => 'pgsql',
        'host' => env('DB_HOST', 'localhost'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNMAE', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'charset' => 'utf8',
        'prefix' => false,
        'schema' => 'public',
    ],

    'sqlsrv' => [
        'driver' => 'sqlsrv',
        'host' => env('DB_HOST', 'localhost'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNMAE', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'charset' => 'utf8',
        'prefix' => false,
    ],
]

示例8-2 Laravel中默认“创建用户表”迁移

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration{
    public function up(){
        Schema::create('users', function(Blueprint $table){
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password', 60);
            $table->rememberToken();
            $table->timestamps();
        });
    }

    public function down(){
        Schema::drop('users');
    }
}

示例8-3 在迁移中添加列索引

// 创建列之后 $table->primary('primary_id'); $table->primary(['first_name', 'last_name']); $table->unique('email'); $table->unique('email', 'optional_custom_index_name'); $table->index('amount'); $table->index('amount', 'optional_custom_index_name');

示例8-4 在迁移中删除列索引

$table->dropPrimary('contacts_id_primary'); $table->dropUnique('contacts_email_unique'); $table->dropIndex('optional_custom_index_name');

示例8-5 使用模型工厂

factory(Post::class)->create([
    'title' => 'My greatest post ever'
]);

factory(User::class, 20)->create()->each(function ($u) use ($post){
    $post->comments()->save(factory(Comment::class)->make([
        'user_id' => $u->id
    ]));
});

示例8-6 为同一个模型定义多个工厂模型

$factory->define(Contact::class, function(Faker\Generator $faker){
    return [
        'name' => $faker->name,
        'email' => $faker->email,
    ];
});

$factory->defineAs(Contact::class, 'vip',function (Faker\Generator $faker){
    return [
        'name' => $faker->name,
        'email' => $faker->email,
        'vip' => true,
    ];
});

示例8-7 继承工厂类型

$factory->define(Contact::class, function(Faker\Generator $faker){
    return [
        'name' => $faker->name,
        'email' => $faker->email,
    ];
});

$factory->defineAs(
    Contact::class,
    'vip',
    function(Faker\Generator $faker) use ($factory){
        $contact = $factory->raw(Contact::class);
        return array_merge($contact, ['vip' => true]);
    });

示例8-8 原始SQL和查询构造器使用示例

//基本语句 DB::statement('drop table users'); //原始查询和参数绑定 DB::select('select * from contacts where validated =?',[true]); //选择使用流畅构造器 $users = DB::table('users')->get(); //joins和其他调用 DB::table('users') ->join('contacts', function($join){ $join->on('users.id', '=', 'contacts.user_id') ->where('contacts.type', 'donor'); })->get();

示例8-9 一个简单的数据库事务

DB::transaction(function() use ($userId,$numVotes){
    //可能失败的DB查询
    DB::table('users')
        ->where('id', $userId)
        ->update(['votes' => $numVotes]);
    //当上面的查询失败时,缓存不想执行的查询
    DB::table('votes')
        ->where('user_id', $userId)
        ->delete();
});

示例8-10 最简单的Eloquent模型

<?php
use Illuminate\Database\Eloquent\Model;
class Contact extends Model{}

示例8-11 最简单的Eloquent模型实现的操作

public function save(Request $request){
    $contact = new Contact();
    $contact->first_name = $request->input('first_name');
    $contact->last_name = $request->input('last_name');
    $contact->email = $request->input('email');
    $contact->save();
    return redirect('contacts');
}

public function show($contactId){
    return Contact::findOrFail($contactId);
}

public function vips(){
    return Contact::where('vip' , true)->get()->map(function($contact){
        $contact->formalName = "The exalted {$contact->first_name} of the {$contact->last_name}s";

        return $contact;
    });
}

示例8-12 在控制器方法中使用Eloquent的OrFail()方法

public function show($contactId){
    return view('contact.show')
        ->with('contact', Contact::findOrFail($contactId));
}

示例8-13 对 Eloquent 查询进行分块来限制内存使用

Contact::chunk(100, function($contact){
    foreach($contacts as $contact){
        //对$contact进行操作
    }
});

示例8-14 通过创建一个新的实例插入 Eloquent 记录

$contact = new Contact;
$contact->name = 'Ken Hirata';
$contact->email = 'ken@hirata.com';
$contact->save();

$contact = new Contact([
    'name' => 'Ken Hirata',
    'email' => 'ken@hirata'
]);
$contact->save();

示例8-15 向create()传入一个数组插入 Eloquent 记录

$contact = Contact::create([
    'name' => 'Keahi Hale',
    'email' => 'halek481@yahoo.com'
]);

示例8-16 通过更新实例的方式更新 Eloquent 记录并保存

$contact = Contact::find(1);
$contact->email = 'natalie@parkfamily.com';
$contact->save();

示例8-17 向update()传入数组以更新一条或多条 Eloquent记录

Contact::where('create_at','<',Carbon::now()->subYear()) ->update(['longevity' => 'ancient']); $contact = Contact::find(1); $contact->update(['longevity' => 'ancient']);

示例8-18 使用整个请求输入更新 Eloquent 模型

//Contact控制器
public function update(Contact $contact,Request $request){
    $contact->update($request->all());
}

示例8-19 通过 Eloquent 的“可填充” 或 “防护” 属性定义批量赋值的字段

class Contact{
    protected $fillable = ['name', 'email'];
    //或
    protected $guarded = ['id' , 'created_at', 'update_at', 'owner_id'];
}

示例8-20 在迁移中添加软删除

Schema::table('contacts', function(Blueprint $table){
    $table->softDeletes();
});

示例8-21 在 Eloquent 模型中开启软删除

<?php
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Contact extends Model{
    use SoftDeletes;
    protected $dates = ['deleted_at'];
}

示例8-22 使用闭包添加全局作用域

...
class Contact extends Model{
    protected static function boot(){
        parent::boot();
        static::addGlobalScope('active', function(Builder $builder){
            $builder->where('active', true);
        });
    }
}

示例8-23 创建全局作用域类

<?php
namespace App\Scores;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Scope;

class ActiveScope implements Scope{
    public function apply(Builder $builder, Model $model){
        return $builder->where('active', true);
    }
}

示例8-24 应用一个基于类的全局作用域

<?php
use App\Scopes\ActiveScope;
use Illuminate\Database\Eloquent\Model;
class Contact extends Model{
    protected static function boot(){
        parent::boot();
        static::addGlobalScope(new ActiveScope);
    }
}

示例8-25 用 Eloquent 访问器装饰一个已存在的列

//模型定义
class Contact extends Model{
    public function getNameAttribute($value){
        return $value?: '(No name provided)';
    }
}
//使用访问器
$name = $contact->name;

示例8-26 使用 Eloquent 访问器为不存在的backing列定义属性

//模型定义
class Contact extends Model{
    public function getFullNameAttribute(){
        return $this->first_name . ' ' . $this->last_name;
    }
}
//使用访问器
$fullName = $contact->full_name;

示例8-27 通过Eloquent修改器对属性值的装饰设置

//定义修改器
class Order extends Model{
    public function setAmountAttribute($value){
        $this->attributes['amount'] = $value > 0? $value:0;
    }
}

//使用修改器
$order->amount = '15';

示例8-28 通过Eloquent修改器设置不存在属性的值

//定义修饰器
class Order extends Model{
    public function setWorkgroupNameAttribute($workgroupName){
        $this->attributes['email']="{$workgroupName}@ourcompany.com";
    }
}
//使用修改器
$order->workgroup_name = 'jstott';

示例8-29 在 Eloquent模型中使用属性转化器

class Contact{
    protected $casts = [
        'vip' => 'boolean',
        'children name' => 'array',
        'bitthday' => 'date',
    ];
}

示例8-30 定义会被转换为timestamps类型的列

class Contact{
    protected $dates = [
        'met_at'
    ];
}

示例8-31 自定义 Eloquent模型中的集合类

...
class OrderCollection extends Collection{
    public function sumBillableAmount(){
        return $this->reduce(function ($carry,$order){
            return $carry+($order->billable? $order->amount:0);
        },0);
    }
}
...
class Order extends Model{
    public function newCollection(array $models = []){
        return new OrderCollection($models);
    }
}

示例8-32 从路由中直接返回JSON

//routes/web.php
Route::get('api/contacts', function(){
    return Contact::all();
});

示例8-33 定义一对一关系

class Contact extends Model{
    public function phoneNumber(){
        return $this->hasOne(PhoneNumber::class);
    }
}

示例8-34 定义反向的一对一关系

class PhoneNumber extends Model{
    public function contact(){
        return $this->belongsTo(Contact::class);
    }
}

示例8-35 定义一个一对多关系

class User extends Model{
    public function contacts(){
        return $this-->hasMany(Contact::class);
    }
}

示例8-36 定义一对多反向关系

class Contact extends Model{
    public function user(){
        return $this->belongsTo(User::class);
    }
}

示例8-37 定义远程一对多关系

class User extends Model{
    public function phoneNumbers(){
        return $this->hasManyThrough(PhoneNumber::class,Contact::class);
    }
}

示例8-38 定义多对多关系

class User extends Model{
    public function contacts(){
        return $this->belongsToMany(Contact::class);
    }
}

示例8-39 定义反向多对多关系

class Contact extends Model{
    public function users(){
        return $this->belongsToMany(User::class);
    }
}

示例8-40 在多对多关系中双向访问关联内容

$user = User::first();
$user->contacts->each(function ($contact){
    //进一步操作
});

$contact = Contact::first();
$contact->users->each(function ($user){
    //
});

$donors = $user->contacts()->where('status', 'donor')->get();

示例8-41 在透视表中添加字段

public function contacts(){
    return $this->belongsToMany(Contact::class)
        ->withTimestamps()
        ->withPrivot('staus', 'preferred_greeting');
}

示例8-42 从关联内容的透视条目中获取数据

$user = User::first();
$user->contacts->each(function($contact){
    echo sprintf(
        'Contact associated with this user at: %s',
        $contact->pivot->created_at;
    );
});

示例8-43 从多台评分系统中创建模型

class Star extends Model{
    public function starrable(){
        return $this->morphosTo();
    }
}
class Contact extends Model{
    public function stars(){
        return $this->morphMany(Star::class, 'starrable');
    }
}

class Event extends Model{
    public function stars(){
        return $this->morphMany(Star::class, 'starrable');
    }
}

示例8-44 从多态关系中获取实例

$contact = Contact::first();
$contact->stars->each(function($star){
    //
});

示例8-45 从多态实例中获取目标

$stars = Star::all(); $stars->each(function($star){ var_dump($star->starrable); });

示例8-46 继承多态系统来区分用户

class star extends Model{
    public function starrable(){
        return $this->morphosTo;
    }
    public function user(){
        return $this->belongsTo(User::class)l
    }
}

class User extends Model{
    public function stars(){
        return $this->hasMany(Star::class);
    }
}

示例8-47 定义多对多的多态状态

class Contact extends Model{
    public function tags(){
        return $this->morphToMany(Tag::class. 'taggable');
    }
}
class Event extends Model{
    public function tags(){
        return $this->morphToMany(Tag::class, 'taggable')
    }
}

class Tag extends Model{
    public function contacts(){
        return $this->morphedByMany(Contact::class, 'taggable');
    }

    public function events(){
        return $this->morphedByMany(Event::class, 'taggable');
    }
}

示例8-48 从多对多多态关系双向访问关联条目

$contact = Contact::first();
$contact->tags->each(function($tag){
    //
});

$tag = Tag::first();
$tag->contacts->each(function($contact){
    //
});

示例8-49 同步更新父类和子类记录

class PhoneNumber extends Model{
    protected $touches = ['contact'];
    public function contact(){
        return $this->belongsTo(Contact::class);
    }
}

示例8-50

$contacts = Contact::all();

foreach ($contacts as $contact){
    foreach($contact->phone_numbers as $phone_number){
        echo $phone_number->number;
    }
}

示例8-51 为 Eloquent事件绑定监听器

class AppServerProvider extends ServiceProvider{
    public function boot(){
        $thirdPartyService = new SomeThirdPartyService;
        Contact::creating(function($contact) use ($thirdPartyService){
            try{
                $thirdPartyService->addContact($contact);
            }catch(Exception $e){
                Log::error('Failed adding contact to thirdPartyService; cancelled.');

                return false;
            }

        });
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
课程目录: 章节1:课前准备 课时1Laravel版本的选择05:46 课时2本地开发环境的搭建07:50 课时3本地域名解析08:40 课时4git的简单介绍08:53 课时5composer的安装和使用11:12 课时6课程源码同步08:14 课时7PHPStorm插件的安装05:44 课时8项目开发流程介绍03:19 章节2aravel基础入门 课时9Laravel的安装以及安装过程中常见问题24:40 课时10Laravel入门介绍08:46 课时11Laravel基本路由27:51 课时12Laravel路由参数32:25 课时13Laravel中间件22:43 章节3:项目模块设计和模板的引入 课时14模板的分离与blade布局模板03:12 课时15功能模块设计03:59 课时16后台控制器的创建与访问20:05 课时17后台模板的引入26:27 课时18前后台模板的获取34:33 章节4:后台-系统配置模板的开发 课时19创建站点配置页面23:57 课时20数据库连接和数据表的创建24:05 课时21网站配置信息写入数据表37:24 课时22完善网站配置(新手常见问题处理)18:59 课时23数据验证与数据闪存27:58 课时24完善系统配置功能27:59 课时25使用pjax提升后用户操作体验17:25 章节5:后台-新闻模块开发 课时26数据迁移与数据填充31:27 课时27新闻列表显示与新增36:33 课时28Laravel中的文件上传23:23 课时29富文本编辑器Neditor的使用28:56 课时30pjax下编辑器的异常处理10:07 课时31Laravel表单请求验证17:35 课时32新闻的编辑与删除34:48 课时33旧图片的处理和自定义公共函数16:10 章节6:无限级分类 课时34无限级分类原理33:06 课时35无限级分类的添加33:03 课时36无限级分类的删除与编辑20:21 课时37静态方法的正确使用07:56 课时38Laravel内置验证规则和自定义验证规则28:58 课时39提示信息的本地化11:34 章节7:后台-产品管理模块开发 课时40产品管理(1)27:23 课时41产品管理(2)-自定义验证规则25:42 课时42产品添加扩展内容14:41 课时43Laravel关联模型的使用21:33 课时44产品的编辑19:39 课时45产品编辑的完善07:13 课时46产品的批量删除与单条删除35:50 课时47使用Laravel模型事件完善产品删除功能18:37 章节8:后台-案例模块的开发 课时48数据表的创建和列表显示21:00 课时49案例的添加16:16 课时50案例的编辑与删除23:50 章节9:后台-单页模块开发 课时51单页模块(1)公司简介的处理32:11 课时52单页模块(2)招贤纳士功能实现35:00 课时53单页模块(3)发展历程的实现29:57 章节10:后台-轮播图模块开发 课时54轮播图模块表的设计与数据迁移09:19 课时55轮播图管理功能(1)20:59 课时56轮播图管理功能(2)32:43 课时57轮播图管理功能(3)自定义验证规则14:06 课时58问题处理21:57 课时59ajax实现异步排序19:42 课时60Laravel中访问器的使用11:42 课时61关于删除功能的扩展27:26 章节11:后台-友情连接模块开发 课时62友情连接模块开发28:07 章节12:后台权限认证 课时63管理员表的设计与创建15:46 课时64管理员登录验证的实现(1)25:11 课时65管理员登录验证的实现(2)23:59 章节13:前台 课时66前台首页的引入与布局模板21:01 课时67前台首页的数据调用(1)29:36 课时68前台首页的数据调用(2)16:51 课时69前台产品展示(1)23:35 课时70前台产品展示(2)15:31 课时71前台新闻数据调用17:50 课时72 Laravel自定义分页样式28:44 课时73前台新闻详情页04:33 课时74 前台案例展示11:37 课时75关于我们数据展示23:45 章节14:SEO优化入门 课时76常用的搜索引擎指令16:40 课时77SEO优化-标签优化11:46 课时78SEO优化-关键词优化08:14 课时79SEO优化-URL-robots优化07:43 课时80nofollow优化和图片优化16:43 课时81网站地图09:01 课时82链接优化与内容优化09:12 课时83百度推送(1)14:26 课时84百度推送(2)自定义类库(单例模式)27:28 课时85百度推送(3)21:13 课时86Laravel中Session的用法(百度推送优

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海燕技术栈

你的鼓励我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值