使用thinkphp6 开发遇到的坑

最近和其他同事配合使用thinkphp开发一个平台,之前一直使用的是laravel,经过这件事我对以后开发项目还是laravel好了。下便总结下thinkphp遇到的几个坑吧:

前提:我个人喜欢将model实例化之后在进行列表的查询处理
eg:
User为用户表, Apply为用户申请表, Work为工作表
user表的字段为:

字段说明
id自增id
name姓名

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()

5、再使用hasWhere的时候filed的限制会不起作用,需要在hasWhere的第三个参数来限制字段了

User::hasWhere('apply', [], 'id')->select();

hasWhere的第三个参数就是你要从UserModel中要获取的字段

我会一直更新这个坑的文章,以上是目前遇到的处理办法,大家还有好的办法可以留言交流下。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Yietion

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值