前几天写了一个关于laravel分表关联的查询,但是个人觉得还不够完善,所以今天重新看了一遍laravel模型的底层代码,终于写出了自己最喜欢的代码暂时满意-laravel风格,简洁优雅是核心。下面直接上demo代码。主要有3张表,用户表和用户礼品表。send_gift_2017_07,send_gift_2017_08gifttableid自增主键user_iduserIDworthgiftvalueuper_idanchorID(也在user表)created_atgifttimebelongsTo(User::class);}关联用户表的外键是uper_idpublicfunctionuper(){return$this->belongsTo(User::class);}}now输入开始日期和结束日期查看用户的送礼记录并分页。copy();$i->format('Y-m')<=$end->format('Y-m');$i->addMonth()){$queries->push(DB::table("send_gift_{$i->format('Y_m')}")//建议使用select查询字段,SQL优化性能尽可能多->select('user_id','worth','uper_id','created_at')->whereBetween('created_at',[$start,$end->tomorrow()]));}//列出一个表作为联合的开始$unionQuery=$queries->shift();//遍历剩余的表以添加联合$queries->each(function($item,$key)使用($unionQuery){$unionQuery->unionAll($item);});//设置临时表名称,添加临时表,顺序不能颠倒,否则关联约束找不到表$lists=with(newSendGift)->setTable('union_send_gift')//添加temporarytable->from(DB::raw("({$unionQuery->toSql()})asunion_send_gift"))//组合查询Condition->mergeBindings($unionQuery)//关联约束,那些不在用户中的表不需要检出->has('user')//倒序->orderBy('created_at','desc')//分页->paginate();//加载关系$lists->load(['user'=>function($query){//关系查询也要优化sql$query->select('id','nickname');},'uper'=>function($query){$query->select('id','nickname');}]);//测试结果$lists->each(function($item,$key){echo"User:{$item->user_id}-{$item->user->nickname}在{$item->created_at->toDateTimeString()}发送了一份价值{$item->worth}的礼物给主播:{$item->uper_id}-{$item->uper->nickname}
";});}}然后我们看SQL关系查询使用了eagerloading,可以有效减少SQL条目数,保证数据库的性能。
