当临时代码不知道放在哪个位置的时候,可以用Tinker来运行。
一个运用中配置多个数据连接,大致有三种情形:
1、不同数据库之间的数据,比如mysql和sql server。

2、不同功能的分库,比如客户数据库和业务数据库。
3、读写分离。
迁移中的up和down,up()代表实行升级,down()代表回滚。
Laravel中,迁移类继续自Migration, 命名是CreateUsersTable。
但是在调用时,命令是用小写下划线分隔:
php artisan make:migration create_users_table --create=users
decimal指定精度和范围,比如decimal('amount', 5, 2), 表示小数位数是2位,总的位数是5位,不包括小数点,即整数部分是3位。
修正字段可以利用change()方法:
$table->string('name', 100)->change();// 将name字段改成100的长度。
利用increments()方法给表增加一个主键索引,后面不用再指定主键。
dropIndex()方法会根据传入的数组,预测须要删除的索引:
$table->dropIndex(['email', 'amount']); // 删除建立在email, amount两个字段上的组合索引。
指定外键的方法:
// 在本表user_id字段建立外键,指向users表中的id字段。
$table->foreign('user_id')->references("id")->on('users');
删除外键,可以直接传入本表字段:
$table->dropForeign(['user_id']);
migrate:refresh表示重新安装。和连续运行migrate:reset, migrate是一样的。
每一个添补器类都须要加入到/database/seeds/DatabaseSeeder.php的run()方法中:
public function run()
{
$this->call(ContactsTableSeeder::class);
}
Faker可以产生比较合理的假数据,例如:$faker->name, $faker->email。在创建记录时,可以担保记录不重复。
模型工厂的make()方法创建了实例,但是不会把它保存进数据库;但是create()会立时保存。
可以利用DB类调用原始的sql语句。个中update()和delete()方法可以返回受影响的行数,但是statement()不会。
Illuminate凑集类似于php数组,拥有map(), filter(), reduce(), each()等方法。
map: 根据数组中的每一项设定函数,返回函数处理后的新数组。
filter: 根据函数过滤数组中的每一项,返回新的数组。
reject: 根据函数过滤数组,把符合条件的项目剔除掉。
reduce: 类似于聚合函数,将数组每一项汇总求和,或连接字符串。根据“聚合”函数处理。
each:返回当前数组的键和值,并且数组指针向前移动到新元素。
组合多个or条件时,可以利用闭包函数:
orWhere(
function($query){
$query->where('created_at', '>', Carbon::now()->subDay())
->where('trial', false);
}
);
重置全体表的自增id和删除全体表的数据:
DB::table('contacts')->truncate();
Eloquent的类名以大写字母开头,并且是单数,例如:
类Contact对应的表名是contacts,SecondaryContact类对应的表名是secondary_contacts。
可以修正继续的韶光格式:protected $dateFormat = 'U';
通过定义可添补字段,防止表的其他字段被修正:protected $fillable = ['name', 'email'];
可以查询的时候,同时根据情形天生记录:
// 查询如果没有记录则创建一条记录在数据库。
Contact::firstOrCreate();
// 创建实例,但是不保存到数据库。
Contact::firstOrNew();
软删除不要轻易利用,利用时,须要把稳清理旧的记录。
// 找出软删除的记录。
Contact::withTrashed()->get();
// 判断实例数据库记录是否被软删除。
if($contact->trashed()){}
类似于快捷查询方法,可以定义实体的浸染域,用于筛选记录:
class Contact{
public function scopeActiveVips($query){
return $query->where('vip', true)->where('trial', false);
}
}
// 利用时去掉scope前缀,首字母小写。
Contact::activeVips()->get();
全局浸染域须要用类定义,继续自Scope, 实现方法apply():
class ActiveScope implemens Scope{
public function apply(Builder $builder, Model $model){
return $builder->where('active', true);
}
}
利用时,在类中boot方法中,通过addGlobalScope()方法加入:
class Contact extends Model{
protected static function boot(){
parent::boot();
static::addGlobalScope(new ActiveScope);
}
}
删除时,将类名传给withoutGlobalScope()方法:
Contact::withoutGlobalScope(ActiveScope::class)->get();
访问器方法的命名规则:
// 去掉下划线,加上前后缀get、set和Attribute。
first_name: getFirstNameAttribute(),setFirstNameAttribute()
可以利用attributes凑集引用字段:
$this->attributes['amount'] = $value > 0 ? $value : 0;
Carbon继续自Datetime,数据库中的date/datetime类型默认解析为Carbon。
Eloquent实体的$dates字段,默认包含created_at和updated_at,还可以加入其他字段:
protected $dates = ['met_at', 'start_at'];
Laravel的路由器会将结果返回成字符串,如果对应实体,则序列化为json格式:
Route::get('api/contacts', function(){
return Contact::all();
});
序列化时,根据白名单指定要序列的属性:
class Contact extends Model{
public $visible = ['name', 'email', 'status'];
}
默认获取数据库记录时,外键关联的实体并不会加载,须要显式指定加载:
User::with('contacts')->first();
如果须要序列化数据库中不存在的字段,则须要在$appends字段中声明:
protected $appends = ['full_name'];
public function getFullNameAttribute(){}