最近和其他同事配合使用thinkphp开发一个平台,之前一直使用的是laravel,经过这件事我对以后开发项目还是laravel好了。下便总结下thinkphp遇到的几个坑吧:
前提:我个人喜欢将model实例化之后在进行列表的查询处理 eg: User 为用户表, Apply 为用户申请表, Work 为工作表 user 表的字段为:
apply 表字段为
字段 | 说明 |
---|
id | 自增id | from_id | 来源id | user_id | 申情人id | resaon | 申请原因 | status | 状态:0-待审核 1-已审核 2审核失败 |
work 表字段为
字段 | 说明 |
---|
id | 自增id | title | 工作名称 | user_id | 负责人id |
其中为User与Apply、Work一对多关联,在用户Modle中处理关系为 User Model:
public function applies() {
return $this->hasMany(Apply::class, 'user_id', 'id');
}
public function works() {
return $this->hasMany(Work::class, 'user_id', 'id');
}
Apply Model
public function user() {
return $this->belongTo(User::class, 'user_id', 'id');
}
public function work() {
return $this->belongTo(Work::class, 'from_id', 'id');
}
Work Model
public function user() {
return $this->belongTo(User::class, 'user_id', 'id');
}
接下来为列表查询,查询申请表apply 的数据:
$builder = new User();
1、hasWhere的表达要放在其他where条件之前 错误:
if($search_text = $request->param('search_test', null)) {
$builder = $builder->where('name', 'LIKE' , '%' . $search_text . '%');
}
$status = $status = $request->param('status', null);
if(!is_null($status)) {
$builder = $builder->hasWhere('applies', function($query) use ($status) {
$query->where('status', $status);
});
}
$data = $builder->alias('User')->select();
正确:
$status = $status = $request->param('status', null);
if(!is_null($status)) {
$builder = $builder->hasWhere('applies', function($query) use ($status) {
$query->where('status', $status);
});
}
if($search_text = $request->param('search_test', null)) {
$builder = $builder->where('name', 'LIKE' , '%' . $search_text . '%');
}
$data = $builder->alias('User')->select();
2、当多个hasWhere的时候我更愿意使用when来查询:
$status = $request->param('status', null);
$search_text = $request->param('search_text', null);
$work_title = $request->param('work_title', null);
$builder = new Apply();
$data = $builder->when($status, function($query) {
$query->hasWhere('user', function($q) use ($search_text) {
$q->where('name', 'LIKE', '%' . $search_text . '%');
});
})->when($work_title, function($query) use ($work_title) {
$query->hasWhere('work', function($q) use ($search_text) {
$q->where('title', 'LIKE', '%' . $search_text . '%');
});
})->select();
3、当有多个了hasWhere的时候,应该是只能在一个hasWhere中使用一个回调方法 错误:(测试了一下只有第二个的条件被引用了,前边的没有被引用)
$data = Apply::hasWhere('user', function($query) {
$query->where('name', '***');
})->hasWhere('work', function($query) {
$query->where('title', '***');
})->select();
正确
$data = Apply::hasWhere('user', ['name' => '***'])
->hasWhere('work', ['title' => '***'])
->select();
4、删除的时候需要加筛选条件,或者先获取到数据再删除 错误:
User::delete();
正确:
User::select()->delete()
我会一直更新这个坑的文章,以上是目前遇到的处理办法,大家还有好的办法可以留言交流下。。。
|