Laravel使用Eloquent合并两张表时如何避免A表记录重复合并到B表
实现方案
1. 调整数据表结构
- 在A表
client_tutor_request1中新增linked_form_id字段:类型为无符号bigint,允许为NULL,默认值为NULL,用来标记该条请求已经关联的B表form记录ID。如果后续也需要限制B表记录不可被重复关联,可以同时在form表新增linked_request_id字段,规则同上。
2. 优化匹配查询逻辑
查询时先过滤掉已经关联过的A表记录,避免重复匹配,并发场景下可以加共享锁防止超匹配:
class MergedController extends Controller { public function merged(Request $request){ $merged = DB::table('client_tutor_request1') ->whereNull('client_tutor_request1.linked_form_id') // 新增:只查询未关联的A表记录 ->join('form', function ($join) { $join->on('client_tutor_request1.courses', '=', 'form.specialty') ->on('form.category', '=', 'client_tutor_request1.category') ->on('form.state', '=', 'client_tutor_request1.state') ->on('form.lga', '=', 'client_tutor_request1.lga'); }) // 注意:原代码select重复写了两次form.lga,已删除冗余字段 ->select('client_tutor_request1.id', 'client_tutor_request1.customers_name', 'client_tutor_request1.customers_phone', 'client_tutor_request1.courses', 'form.employees_name', 'form.state', 'form.lga', 'form.city', 'form.address', 'form.category') ->groupBy('client_tutor_request1.id') // 新增:保证每条A表记录只匹配一条B表记录 ->orderBy('client_tutor_request1.id') ->get(); return view("employee.linkup", ["merged" => $merged]); } }
3. 关联完成后更新标记
确认要绑定某条A表和B表记录后,执行更新操作标记A表记录已关联,后续查询不会再带出该记录:
// $requestId为A表记录ID,$formId为绑定的B表记录ID DB::table('client_tutor_request1') ->where('id', $requestId) ->update(['linked_form_id' => $formId]);
补充:Eloquent ORM实现示例
首先创建对应模型类:
ClientTutorRequest 模型
namespace App\Models; use Illuminate\Database\Eloquent\Model; class ClientTutorRequest extends Model { protected $table = 'client_tutor_request1'; // 筛选未关联记录的作用域 public function scopeUnlinked($query) { return $query->whereNull('linked_form_id'); } // 关联已绑定的form记录 public function linkedForm() { return $this->hasOne(Form::class, 'id', 'linked_form_id'); } }
Form 模型
namespace App\Models; use Illuminate\Database\Eloquent\Model; class Form extends Model { protected $table = 'form'; }
控制器查询代码
$merged = ClientTutorRequest::unlinked() ->join('form', function ($join) { $join->on('client_tutor_request1.courses', '=', 'form.specialty') ->on('form.category', '=', 'client_tutor_request1.category') ->on('form.state', '=', 'client_tutor_request1.state') ->on('form.lga', '=', 'client_tutor_request1.lga'); }) ->select('client_tutor_request1.id', 'client_tutor_request1.customers_name', 'client_tutor_request1.customers_phone', 'client_tutor_request1.courses', 'form.employees_name', 'form.state', 'form.lga', 'form.city', 'form.address', 'form.category') ->groupBy('client_tutor_request1.id') ->orderBy('client_tutor_request1.id') ->get();
内容的提问来源于stack exchange,提问作者solo
相关产品推荐
相关产品推荐

