关于Laravel的一些小事 不定时更新

本文主要记录从学Laravel开始 实际工作中经常用到的一些小用法知识点 老是忘记 记录下方便自己以后查找 不定时更新


Laravel 中Model的 with方法 预加载方法小记

如果你需要在关联的With中控制返回的数据字段 比如

1
User::with('log')->get();

而你只需要log中的title字段
如果你不做处理这时候你如果有调用log的时候他会加载全部的log数据库字段
你可以这样设置 就是查询他的主键+你需要的字段 注意主键一定要查询 不然他会返回你所真正需要的字段

1
2
3
User::with(['log' => function($query){
$query->select('id','你需要的字段');
}])

在本地执行Laravel的队列

在本地执行Larave中的队列话 需要先执行一次 work 开启队列 然后使用listen 来监听就好了 就会自动执行了 但是他是一条一条执行的效率有点慢

1
php artisan queue:work

1
php artisan queue:listen --queue=push_wechat

Larave中Model让他自己维护created_at和updated_at时间问题

有时候我们会在数据库表中增加 created_atupdated_at 字段 自己去维护也可以 不过就烦就是
可是使用Laravel 让他自己去维护
1.数据库增加字段 created_atupdated_at 并设置类型 int 如果很大的话可以 bigint 【ps:我又看到需要设置成timesteamp 但测试并不可以不知道是Laravel版本问题还是啥别的设置影响了 待补充测试】
2.把这2个字段需要加入到Model中的 fillable 数组中
3.使用 create 方法会自动维护 insert方法并不会自动维护但是和一次性插入多条记录 另外对象的实例的 save 方法也是可以自动维护的
4.如果你数据库设置的是int类型的 需要在Model中增加 protected $dateFormat = “U”; 或者重写 fromDateTime 方法

1
2
3
public function fromDateTime($value){
return strtotime(parent::fromDateTime($value));
}

Laravel 软删除

有时候需要软删除数据 操作如下

数据库添加 deleted_at 字段 类型 int 即可
在对应的Model中 引入 use Illuminate\Database\Eloquent\SoftDeletes;
在类中使用 上面的类 use SoftDeletes;
类中增加软删除的数组标识protected $dates = ['deleted_at'];

后续在执行delete()删除方法的时候就不会真的删除数据看 而是在数据库中 deleted_at 字段填上删除的时间
后面的查询会自动过滤掉软删除掉的记录

如果想在查询结果中包含软删除的记录
1
2
$posts = Model::withTrashed()->get();
dd($posts);
如果只想查询软删除的记录
1
2
$posts = Model::onlyTrashed()->get();
dd($posts);
软删除恢复
1
Model::withTrashed()->where('id',1)->restore();
强制删除 forceDelete()

Laravel Model 中追加字段

比如我们有时候我们在数据库中存的是一个id值
需要在查询返回的时候把这个id对应的换成需要显示的一些文字的
这时候我们可以追加一些字段来返回他对应的信息

在Model中设置 appends 数组 里面是你要追加返回的字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//追加自定义字段
protected $appends = ['type_text','created_at_text'];
public function getTypeTextAttribute(){
$type = $this->attributes['type'];
$arr=array(
1=>'社保',
2=>'公积金',
);
$text="";
if(isset($arr[$type])){
$text = $arr[$type];
}
return $this->attributes['type_text'] = $text;
}
public function getCreatedAtTextAttribute(){
$created_at = $this->attributes['created_at'];
$text = date('Y-m-d',strtotime($created_at));
return $this->attributes['created_at_text'] = $text;
}

Laravel的分块查询

1
2
3
4
5
6
7
8
9
10
11
12
13
Employee::where('gender',0)->where('card_type','id_card')->chunk(200,function($query){
//注意这里的$query已经是一个Collection 因此不需要在去使用get()之类去获取结果 可以直接用来遍历
foreach ($query as $key => $val){
$seventeen = substr($val->card_no,16,1);
if($seventeen % 2 == 0){
//偶数=女
$gender = 2;
}else{
$gender = 1;
}
Employee::where('id',$val->id)->update(['gender' => $gender]);
}
});

Laravel-Model 批量操作字段设置

Laravel 允许在Model中设置字段属性是否允许被批量赋值操作

$fillable 的数组中 这相当于一个白名单 这里的字段都允许批量操作
$guarded 的数组中相当于一个黑名单 加入这里的字段都不可以被批量操作 同样不在他里面的字段都是可以批量操作的
这2个属性互斥 不能同时出现在Model中只能出现其中之一

1
可以在Model中设置对应的属性是否允许批量赋值(添加 更新之类)

Laravel 更新数据

有时候我们查询了一条数据 只有一条数据的时候

1
2
3
$payment = PayRecord::where('order_uuid', $orderUuid)
->select('id', 'order_uuid', 'order_type')
->first();

这个时候我们拿到了数据的对象 本例子中是 $payment

这个时候我们可以拿它直接进行更新的操作 不需要使用 Modelsupdate

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$updateData = [
'pay_record' => $data['trade_no'],
'pay_status' => 1,
'paid_at' => $paidTime,
];
$updateResult = $payment->update($updateData);
//或者 下面这种形式都可以
$payment->pay_record = $data['trade_no'];
$payment->pay_status = 1;
$payment->paid_at = $paidTime;
$payment->save();

注意 如果想使用这个方式来更新数据的话 需要在获取对象的时候一定要查询包含 主键 不然更新不了的

Larave 为同一个Group下的路由指定不同的中间件

1
2
3
4
Route::group(['prefix' => 'payment'], function(){
Route::post('pay', 'PaymentController@pay')->middleware('oauth:user');//统一支付入口
Route::post('refund', 'PaymentController@refund')->middleware('oauth');//统一退款入口
});

Laravel 中查询 结果返回 key->value的形式

有时我们只需要查询 2个 字段 一个当 Key 一个当Value的形式返回 可以使用下面
注意pluck是作用在collection下的 所以需要先获取到collection对象 可以使用get() first()方法等

1
2
$userApps = User_app::where('uuid', $uuid)->get()->pluck('openid', 'user_code');
第一个参数是value 第二个参数是key

Laravel 中判断查询的结果 Collection 是否为空的方法

我们在使用Laravel的关联模型查询的时候 Eloquent 查询 get() 等的时候其实是返回了一个 Illuminate\Database\Eloquent\Collection对象实例 可以使用下面的方法来判断是否为空 也就是没有结果

1
2
3
if ($result->first()) { }
if (!$result->isEmpty()) { }
if ($result->count()) { }

Laravel with查询取值问题

比如我们在使用with的时候 刚好方法名是有 小驼峰法 命名的 这个时候遍历中取值的问题

1
2
3
4
5
6
7
8
9
10
11
12
$query = Model::wint('userShow')->where($where);
//有两种情况 第一种就是直接get() 获取记录 这种情况下的遍历
$result = $query->get();
foreach($result as $key => $val) {
echo $val->user_show->xxx;
}
//第二种情况 就是有分页的获取记录
$result = $query->paginate($pageSize);
foreach($result as $key => $val) {
echo $val->userShow->xxx;
}

-------------The End-------------