hasOne(CoachInfoRecord::class, 'id', 'info_record_id'); } /** * 获取技师关联的用户 */ public function user() { return $this->belongsTo(MemberUser::class, 'user_id'); } /** * 获取技师的统计数据 */ public function statistic() { return $this->hasOne(CoachStatistic::class, 'coach_id'); } /** * @Author FelixYin * * @description 技师所属会员 */ public function member() { return $this->belongsTo(MemberUser::class, 'user_id', 'id'); } /** * @Author FelixYin * * @description 基本信息认证记录 */ public function infoRecords() { return $this->hasMany(CoachInfoRecord::class, 'coach_id', 'id'); } /** * @Author FelixYin * * @description 技师关联资质信息 */ public function qual() { return $this->hasOne(CoachQualRecord::class, 'id', 'qualification_record_id'); } /** * @Author FelixYin * * @description 技师关联评分 */ public function score() { return $this->hasOne(CoachScore::class, 'coach_id', 'id'); } /** * @Author FelixYin * * @description 技师关联定位 */ public function locations() { return $this->hasMany(CoachLocation::class, 'coach_id', 'id'); } /** * @Author FelixYin * * @description 技师关联订单 */ public function orders() { return $this->hasMany(Order::class, 'coach_id', 'id'); } /** * @Author FelixYin * * @description 技师关联抢单记录 */ public function grabRecords() { return $this->hasMany(OrderGrabRecord::class, 'coach_id', 'id'); } /** * @Author FelixYin * * @description 技师关联评论 */ public function comments() { return $this->hasMany(OrderComment::class, 'coach_id', 'id'); } /** * @Author FelixYin * * @description 技师关联钱包 */ public function wallet() { return $this->morphOne(Wallet::class, 'owner'); } /** * @Author FelixYin * * @description 技师所属店铺 */ public function shop() { return $this->belongsTo(ShopInfo::class, 'shop_id', 'shop_id', 'id'); } /** * @Author FelixYin * * @description 技师关联店铺开通服务 */ public function shopOpenService() { return $this->hasMany(ShopCoachService::class, 'coach_id', 'id'); } /** * @Author FelixYin * * @description 技师关联实名信息 */ public function real() { return $this->hasOne(CoachRealRecord::class, 'id', 'real_auth_record_id'); } /** * @Author FelixYin * * @description 技师开通项目 */ public function projects() { return $this->hasMany(CoachProject::class, 'coach_id', 'id'); } /** * @Author FelixYin * * @description 技师关联资质记录 */ public function qualRecords() { return $this->hasMany(CoachQualRecord::class, 'coach_id', 'id'); } /** * @Author FelixYin * * @description 技师关联实名认证记录 */ public function realAuthRecords() { return $this->hasMany(CoachRealRecord::class, 'coach_id', 'id'); } /** * 验证技师状态是否正常 * * @param string|null $message 自定义错误消息 * @throws \Illuminate\Http\Exceptions\HttpResponseException 当技师状态异常时抛出异常 */ public function validateActiveStatus(?string $message = null): void { abort_if( $this->state != TechnicianStatus::ACTIVE->value, 422, $message ?? '技师状态异常' ); } /** * 创建或更新技师项目关联 * * @param int $projectId 项目ID * @param int $state 项目状态 * @return CoachProject 返回创建或更新的技师项目关联实例 */ public function updateOrCreateProjectRelation(int $projectId, int $state): CoachProject { return $this->projects()->updateOrCreate( ['project_id' => $projectId], [ 'state' => $state, 'discount_amount' => 0.00, // 默认折扣金额 'service_gender' => 0, // 默认服务性别(不限) 'service_distance' => 0, // 默认服务距离 'traffic_fee_type' => 2, // 默认交通费类型(双程) ] ); } /** * 获取最新的基本信息审核记录 * 通过 latest() 获取最新的一条记录 * * 业务逻辑: * 1. 建立与基本信息记录表的一对一关联 * 2. 按创建时间倒序排序 * 3. 获取最新的一条记录 * * @return \Illuminate\Database\Eloquent\Relations\HasOne */ public function latestInfoRecord() { // 一对一关联,并按创建时间倒序获取最新记录 return $this->hasOne(CoachInfoRecord::class, 'coach_id') ->latest(); } /** * 获取最新的实名认证审核记录 * 通过 latest() 获取最新的一条记录 * * 业务逻辑: * 1. 建立与实名认证记录表的一对一关联 * 2. 按创建时间倒序排序 * 3. 获取最新的一条记录 * * @return \Illuminate\Database\Eloquent\Relations\HasOne */ public function latestRealRecord() { // 一对一关联,并按创建时间倒序获取最新记录 return $this->hasOne(CoachRealRecord::class, 'coach_id') ->latest(); } /** * 获取最新的资质认证审核记录 * 通过 latest() 获取最新的一条记录 * * @return \Illuminate\Database\Eloquent\Relations\HasOne */ public function latestQualRecord() { // 一对一关联,并按创建时间倒序获取最新记录 return $this->hasOne(CoachQualRecord::class, 'coach_id') ->latest(); } /** * 获取常用位置 * 只获取类型为常用位置的记录 * * @return \Illuminate\Database\Eloquent\Relations\HasOne */ public function commonLocation() { // 一对一关联,并限定位置类型为常用位置 return $this->hasOne(CoachLocation::class, 'coach_id') ->where('type', TechnicianLocationType::COMMON->value); } /** * 获取技师统计数据 * 包含订单数、评分等统计信息 * * @return \Illuminate\Database\Eloquent\Relations\HasOne */ public function statistics() { // 一对一关联技师统计数据 return $this->hasOne(CoachStatistic::class, 'coach_id'); } }