169 lines
4.0 KiB
PHP
169 lines
4.0 KiB
PHP
|
|
<?php
|
|||
|
|
|
|||
|
|
namespace app\repository;
|
|||
|
|
|
|||
|
|
use MongoDB\Laravel\Eloquent\Model;
|
|||
|
|
use MongoDB\Laravel\Eloquent\Builder;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 用户手机号关联仓储
|
|||
|
|
*
|
|||
|
|
* 对应集合:user_phone_relations
|
|||
|
|
* 字段定义参考:`提示词/数据库字段.md` 中 user_phone_relations 段落。
|
|||
|
|
*/
|
|||
|
|
class UserPhoneRelationRepository extends Model
|
|||
|
|
{
|
|||
|
|
/**
|
|||
|
|
* 指定使用的数据库连接
|
|||
|
|
*
|
|||
|
|
* @var string
|
|||
|
|
*/
|
|||
|
|
protected $connection = 'mongodb';
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 对应的 MongoDB 集合名
|
|||
|
|
*
|
|||
|
|
* @var string
|
|||
|
|
*/
|
|||
|
|
protected $table = 'user_phone_relations';
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 主键字段
|
|||
|
|
*
|
|||
|
|
* @var string
|
|||
|
|
*/
|
|||
|
|
protected $primaryKey = 'relation_id';
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 主键类型
|
|||
|
|
*
|
|||
|
|
* @var string
|
|||
|
|
*/
|
|||
|
|
protected $keyType = 'string';
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 是否自增主键
|
|||
|
|
*
|
|||
|
|
* @var bool
|
|||
|
|
*/
|
|||
|
|
public $incrementing = false;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 允许批量赋值的字段
|
|||
|
|
*
|
|||
|
|
* @var array<int, string>
|
|||
|
|
*/
|
|||
|
|
protected $fillable = [
|
|||
|
|
'relation_id',
|
|||
|
|
'phone_number',
|
|||
|
|
'phone_hash',
|
|||
|
|
'user_id',
|
|||
|
|
'effective_time',
|
|||
|
|
'expire_time',
|
|||
|
|
'is_active',
|
|||
|
|
'type',
|
|||
|
|
'is_verified',
|
|||
|
|
'source',
|
|||
|
|
'create_time',
|
|||
|
|
'update_time',
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 字段类型转换
|
|||
|
|
*
|
|||
|
|
* @var array<string, string>
|
|||
|
|
*/
|
|||
|
|
protected $casts = [
|
|||
|
|
'effective_time' => 'datetime',
|
|||
|
|
'expire_time' => 'datetime',
|
|||
|
|
'is_active' => 'boolean',
|
|||
|
|
'is_verified' => 'boolean',
|
|||
|
|
'create_time' => 'datetime',
|
|||
|
|
'update_time' => 'datetime',
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 禁用 Laravel 默认的 created_at/updated_at
|
|||
|
|
*
|
|||
|
|
* 我们使用 create_time / update_time 字段。
|
|||
|
|
*
|
|||
|
|
* @var bool
|
|||
|
|
*/
|
|||
|
|
public $timestamps = false;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 根据 relation_id 获取关联记录
|
|||
|
|
*
|
|||
|
|
* @param string $relationId
|
|||
|
|
* @return self|null
|
|||
|
|
*/
|
|||
|
|
public function findByRelationId(string $relationId): ?self
|
|||
|
|
{
|
|||
|
|
/** @var Builder $query */
|
|||
|
|
$query = static::query();
|
|||
|
|
return $query->where('relation_id', $relationId)->first();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 根据手机号哈希查找当前有效的关联
|
|||
|
|
*
|
|||
|
|
* @param string $phoneHash
|
|||
|
|
* @param \DateTimeInterface|null $atTime 查询时间点(默认为当前时间)
|
|||
|
|
* @return self|null
|
|||
|
|
*/
|
|||
|
|
public function findActiveByPhoneHash(string $phoneHash, ?\DateTimeInterface $atTime = null): ?self
|
|||
|
|
{
|
|||
|
|
$queryTime = $atTime ?? new \DateTimeImmutable('now');
|
|||
|
|
|
|||
|
|
/** @var Builder $query */
|
|||
|
|
$query = static::query();
|
|||
|
|
return $query->where('phone_hash', $phoneHash)
|
|||
|
|
->where('effective_time', '<=', $queryTime)
|
|||
|
|
->where(function($q) use ($queryTime) {
|
|||
|
|
$q->whereNull('expire_time')
|
|||
|
|
->orWhere('expire_time', '>=', $queryTime);
|
|||
|
|
})
|
|||
|
|
->where('is_active', true)
|
|||
|
|
->orderBy('effective_time', 'desc')
|
|||
|
|
->first();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 根据用户ID查找所有手机号关联(当前有效)
|
|||
|
|
*
|
|||
|
|
* @param string $userId
|
|||
|
|
* @param bool $includeHistory 是否包含历史记录
|
|||
|
|
* @return array<self>
|
|||
|
|
*/
|
|||
|
|
public function findByUserId(string $userId, bool $includeHistory = false): array
|
|||
|
|
{
|
|||
|
|
/** @var Builder $query */
|
|||
|
|
$query = static::query();
|
|||
|
|
$query->where('user_id', $userId);
|
|||
|
|
|
|||
|
|
if (!$includeHistory) {
|
|||
|
|
$query->where('is_active', true)
|
|||
|
|
->whereNull('expire_time');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return $query->orderBy('effective_time', 'desc')->get()->all();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 根据手机号哈希查找所有历史关联记录
|
|||
|
|
*
|
|||
|
|
* @param string $phoneHash
|
|||
|
|
* @return array<self>
|
|||
|
|
*/
|
|||
|
|
public function findHistoryByPhoneHash(string $phoneHash): array
|
|||
|
|
{
|
|||
|
|
/** @var Builder $query */
|
|||
|
|
$query = static::query();
|
|||
|
|
return $query->where('phone_hash', $phoneHash)
|
|||
|
|
->orderBy('effective_time', 'desc')
|
|||
|
|
->get()
|
|||
|
|
->all();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|