CakePHP 4自定义hasOne关联:如何获取会员最新地址?
配置CurrentAddress关联获取会员当前地址
要在Members表中通过hasOne关联获取每个会员start值最大的地址,需要借助子查询动态匹配每个会员的最新地址时间,具体配置如下:
在MembersTable.php的initialize()方法中,先构建子查询计算每个会员的最大start值,再将其作为关联条件:
public function initialize(array $config): void { parent::initialize($config); // 构建子查询:获取每个会员对应的最大start时间 $maxStartSubquery = $this->Addresses->find() ->select([ 'member_id', 'max_start' => $this->Addresses->query()->func()->max('start') ]) ->groupBy('member_id'); // 配置CurrentAddress关联 $this->hasOne('CurrentAddress', [ 'foreignKey' => 'member_id', 'className' => 'Addresses', 'conditions' => function (\Cake\ORM\Query $query) use ($maxStartSubquery) { // 关联条件:当前地址的start等于该会员的最大start值 return $query->newExpr()->add([ 'Addresses.start' => $query->select('max_start') ->from($maxStartSubquery) ->where(['member_id = Members.id']) ]); } ]) ->setProperty('current_address') ->setDependent(true); }
原理说明
- 子查询先按
member_id分组,计算出每个会员的最大start时间值 - 关联条件通过动态子查询传入当前会员
id,匹配出对应最大start的地址记录 - 查询会员数据时,
current_address字段会自动加载该会员最新的地址记录
内容的提问来源于stack exchange,提问作者molarum
相关产品推荐
相关产品推荐

