Thinkphp5 爬过的坑

记录使用过程中遇到的坑

  1. * validate 验证器中的date规则 *
    如下validate :
class PartTime extends Validate
{
protected $rule = [
        'birtyday' => 'require|date'
    ];
protected $message = [
        'birtyday.require' => '生日必填',
        'birtyday' => '生日格式错误',
    ];
}
// 调用验证
$result = $this->validate($data, 'PartTime');

if (true !== $result) {
    return $this->outMessage([], '-2', $result);
}

问题(坑):
当data里的birtyday 值为:‘x’一位字符串时,验证不会检测到错误,这明显不是时间格式字符串。
但是’xx’ 一位以上的字符串,验证能检测到错误。
我们看看它的源码:

case 'date':
   // 是否是一个有效日期
   $result = false !== strtotime($value);
   break;

问题就在这里了,我们可以测试以下:

if (false !== strtotime('s')) {
    echo 'ssss';
}

输出 : ssss
所以这个验证方法是有问题的,稍微改下:

case 'date':
  // 是否是一个有效日期
  $result = (false !== strtotime($value) && strlen($value) > 1);
  break;

—————————————–完美分割线————————————————–
2. * 模型with方法 *
这个坑在模型关联“懒加载”的方法with上,错误写法:

public function getDataWithRelation($xxId)
{
    return $this->where('xx_id', $xxId)->with('post, industry')->select();
}
public function post()
{
    return $this->beLongsTo('Post', 'post_id', 'id')->field('id, name');
}

public function industry()
{
    return $this->beLongsTo('Industry', 'industry_id', 'id')->field('id, name');
}
// 注意上面的with里面第二个关联模型xxz之前有个空格

这样写法,测试会报错:
Thinkphp5 爬过的坑_第1张图片
我的编码习惯,都是会在’,’后面跟个空格,在这里就会报错。
看他源码:它是直接把with里面的参数,直接用explode(‘,’, $with),然后拼接字符串,这样空格就存在问题了,优化的话,可以explode后,用trim去除空格,或者拼接之前trim。
正确写法,把那个空格去掉就可以了。

public function getDataWithRelation($xxId)
{
    return $this->where('xx_id', $xxId)->with('post,industry')->select();
}

—————————————–完美分割线————————————————–
3. model 的create 和save 问题:
问题处在allowField()方法,只能save用,create 不行。就是新增时如果想使用allowField()方法过滤非数据库表字段,不能使用

$this::allowField(true)->create($data);

只能使用:

$this::allowField(true)->save($data);

我需要保存后返回新增的对象给我,所以要用到create,save只返回新增的ID。
看源码发现:create 方法提供第二个参数,field,可以设置,但是没有allowField那么方便。
解决我的这个问题,办法就是使用:

$this::allowField(true)->create($data, 'name, xxx,xx,xxxx');

—————————————–完美分割线————————————————–
4. 模型关系配置问题
在配置关联关系时,如果要过滤字段,字段里必须要有关联关系的id,否则会报错

return $this->hasMany('app\job\model\Company', 'userid', 'id')->field('id, name');

会报错:
Thinkphp5 爬过的坑_第2张图片
必须加上:

return $this->hasMany('app\job\model\Company', 'userid', 'id')->field('id, name, userid');

而在配置beLongsTo的时候就得跟上id。
—————————————–完美分割线————————————————–
5. 模型关联查询的巨坑
配置好关联关系后,如果是层级查询时,同一个层级的多个子模型查询会被最后一个覆盖,直接见代码:

$this->where('id', $id)->field('id, title, userid, post_id, salary_range_id, welfare_id, num, qualifications_id, job_year_id, address, linkman, tele, describe, update_time')->with('post,salaryRange,welfare,member.company.companyScale,member.company.companyNature,member.company.industry')->find();

这里想要查询出member.company 的companyNature,industry,companyScale,机会有大问题:

"member": {
    "id": 28,
    "company": {
        "id": 1,
        "name": "云紫峰",
        "userid": 28,
        "company_scale_id": 2,
        "company_nature_id": 3,
        "industry_id": 2,
        "industry": {
            "id": 2,
            "name": "会计/金融/银行/保险"
        }
    }
}

最后一个配置的是industry 会覆盖之前的companyNature,companyScale
* 问题已经找到,是with里面写法问题 *
正确写法:

$this->where('id', $id)->field('id, title, userid, post_id, salary_range_id, welfare_id, num, qualifications_id, job_year_id, address, linkman, tele, describe, update_time')->with(['post','salaryRange','welfare','member.company' => ['companyScale','companyNature','industry']])->find();

预加载同一个模型的多个子模型要使用数组方式传入。

你可能感兴趣的:(thinkphp5)