join重复数据 tp5_tp5实现跨数据库关联查询

这是一个关于ThinkPHP5(TP5)框架下如何处理关联查询,特别是涉及跨数据库关联查询的代码实现。该trait包含`useRelationQuery`和`scopeUseRelationQuery`方法,用于处理单个和多个关联模型的JOIN操作,并支持自定义关联条件和JOIN类型。
摘要由CSDN通过智能技术生成

namespace app\common\traits\model;

use think\db\Query;

use think\Model;

trait RelationHelpers

{

/*** 使用关联查询(别名,Model对象调用)* @param mixed $relation 子模型对象* @param null $alias 子模型别名(单个关联时有效)* @param null $condition 关联条件* @param string $joinType JOIN类型* @return Query*/

public function useRelationQuery(

$relation,

$alias = null,

$condition = null,

$joinType = 'INNER'

) {

return $this->handldRelationQuery($this, $relation, $alias, $condition, $joinType);

}

/*** 使用关联查询(别名,Query对象调用)* @param Query $parent 父Query对象* @param null $relation 子模型对象* @param null $alias 子模型别名(单个关联时有效)* @param null $condition 关联条件* @param string $joinType JOIN类型* @return Query*/

public function scopeUseRelationQuery(

Query $parent,

$relation,

$alias = null,

$condition = null,

$joinType = 'INNER'

) {

return $this->handldRelationQuery($parent->getModel(), $relation, $alias, $condition, $joinType);

}

/*** 使用关联查询(支持跨库查询)* @param Model $parent 父模型对象* @param mixed $relation 子模型对象* @param null $relationAlias 子模型别名(单个关联时有效)* @param null $condition 关联条件* @param string $joinType JOIN类型* @return Query** 参数说明* parent* 父模型对象* relation* 关联的子模型对象。多个模型关联时,可传入一个数组* 数组格式:[Model relation, string|null relationAlias, mixed condition, string joinType]* relationAlias* 子模型别名。单个关联时有效,如果参数值为 null 时,默认以模型类名作为别名* condition* 关联条件。可以为字符串或数组, 为数组时每一个元素都是一个关联条件* joinType* 关联类型。可以为:INNER、LEFT、RIGHT、FULL,不区分大小写,默认为INNER** Example* 单个关联:(new TestA())->useRelationQuery(new TestB(), null, 'TestA.id=Test.id');* 多个关联:(new TestA())->useRelationQuery([[new TestB(), null, 'TestA.id=Test.id']]);*/

public function handldRelationQuery(

Model $parent,

$relation,

$relationAlias = null,

$condition = null,

$joinType = 'INNER'

) {

list($parentTable, $parentTableAlias) = $this->getJoinTable($parent);

$aliass = $parent->getOptions('alias');

$parentTableAlias = empty($alias = $aliass[$parent->getTable()]) ? $parentTableAlias : $alias;

$this->setTable($parentTable)->alias($parentTableAlias);

if (empty($condition)) {

// 如果为组数,则循环调用join foreach ($relation as $_join) {

list($model, $alias, $condition, $joinType) = array_pad($_join, 4, null);

list($childTable, $tableAlias) = $this->getJoinTable($model);

$childTableAlias = $alias ?: $tableAlias;

$this->join(

[$childTable => $childTableAlias],

$condition,

$joinType ?: 'INNER'

);

}

} else {

list($childTable, $tableAlias) = $this->getJoinTable($relation);

$childTableAlias = $relationAlias ?: $tableAlias;

$this->join(

[$childTable => $childTableAlias],

$condition,

$joinType

);

}

return $this;

}

/*** 获取JOIN表名及别名* @param Model $query* @return array*/

protected function getJoinTable(Model $query)

{

$table = $query->getConfig('database') . '.' . $query->getTable();

$tableAlias = basename(str_replace('\\', '/', get_class($query)));

return [$table, $tableAlias];

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值