THINKPHP中在一对多的数据关系中使用hasOne的一些注意事项

发布时间:2024-04-03浏览次数:150 次
使用thinkphp框架在对实际数据关系为一对多的数据库设计使用一对一hasOne模型关联时,一般都是我们需要从一堆数据中只取一条数据,表面上这是没什么问题的,

使用thinkphp框架在对实际数据关系为一对多的数据库设计使用一对一hasOne模型关联时,一般都是我们需要从一堆数据中只取一条数据,表面上这是没什么问题的,而且在大多数场景下都是没问题的,比如:有一个项目表project有一个进度表progress,一条项目对一个多条进度,实际为一对多的关系,但是每次我们取数据时,只需要取符合条件的一条进度数据,并进行关联(使用hasOne中的bind属性可以很好的完成)。我们的模型关系定义如下:

project模型

public function progress()
    {
        return $this->hasOne(Progress::class, 'pro_id', 'id')
            ->order('id', 'desc')

            ->field('id,pro_id,create_time')
            ->bind([
                'pgs_id' => 'id', 'pro_id',
'create_time'
            ]);
    }

此时,当我们从控制器去取数据时,排序是有效的,也就是会取到符合条件的最后一条数据

$project = Project::with(['progress'])->find(4);
print_r($project->toArray());

但是,坑点来了,当我们在hasOne模型关联的字段中,定义一些聚合字段时,排序就无效了,如:

public function progress()
{
    return $this->hasOne(Progress::class, 'pro_id', 'id')
        ->order('id','desc')

        ->field('id,pro_id,sum(ex_center_cz+ex_center_jj) as ex_center_total,create_time');
}

即,在字段field中,我们使用了sum聚合函数,则此时排序是无效的。

但是我们使用其他一些函数的时候,则是有效的。比如:

public function progress()
{
    return $this->hasOne(Progress::class, 'pro_id', 'id')
        ->order('id','desc')

        ->field('id,pro_id,CONCAT(id,pro_id) as new_id,
        (ex_center_cz + ex_center_jj) as ex_center,(ex_prov_cz + ex_prov_jj) as ex_prov');
}

其实文章写到这里,我也发现是我自己的问题了,不是thinkphp的坑点了,不过进而也证明了ThinkPHP还是很强大可靠的。

标签:
扫一扫,在手机上查看