php—复杂的模型关系,难以跨多个表返回数据

67up9zun  于 2021-06-24  发布在  Mysql
关注(0)|答案(0)|浏览(285)

今天已经结束了,如果我的要求没有意义,请提前道歉。在laravel5.2中,我们有一个用户和客户机模型。用户可以有许多客户端。客户机的所有数据都分布在三到四个不同的表中,我们使用的是链接表。为了从客户机的所有表中选择所有必需的数据,我有一个执行连接和选择的长查询。但是,我尝试使用雄辩的模型来处理急切的加载和有困难的情况。
客户端模型与用户的关系:

  1. public function user() {
  2. return $this->belongsTo('App\User');
  3. }
  4. public function clients() {
  5. return $this->hasMany('App\Models\Clients', 'clientID');
  6. }
  7. public function session()
  8. {
  9. return $this->belongsToMany('App\Models\Session','LNK_SessionClients','ClientID','SessionID');
  10. }
  11. public function sessionClients()
  12. {
  13. return $this->belongsToMany('App\Models\Session','LNK_SessionClients','ClientID','SessionID');
  14. }
  15. public function addresses()
  16. {
  17. return $this->hasMany('App\Models\ClientAddress', 'ClientID');
  18. }
  19. public function phones()
  20. {
  21. return $this->hasMany('App\Models\ClientPhone', $this->primaryKey)->where('PhoneNumber', '!=' ,'');
  22. }
  23. public function clientPhoneNumbers() {
  24. return $this->belongsTo('Client');
  25. }
  26. public function emails()
  27. {
  28. return $this->hasMany('App\Models\ClientEmail', $this->primaryKey)->where('EmailAddress', '!=' ,'');
  29. }
  30. public function getPhonesListAttribute()
  31. {
  32. $query = $this->phones()->where('PhoneNumber', '!=', '');
  33. return ['count' => $query->count(), 'list' => $query->pluck('PhoneNumber')];
  34. }
  35. public function getEmailsListAttribute()
  36. {
  37. $query = $this->emails()->where('EmailAddress', '!=', '');
  38. return ['count' => $query->count(), 'list' => $query->pluck('EmailAddress')];
  39. }

我真正需要的是:

  1. $clients = DB::table('tbl_clients')
  2. ->leftJoin('tbl_clientphones', 'tbl_clients.clientID', '=', 'tbl_clientphones.ClientId')
  3. ->leftJoin('tbl_clientemails', 'tbl_clients.clientID', '=', 'tbl_clientemails.ClientId')
  4. ->leftJoin('lnk_sessionclients', 'tbl_clients.clientID','=','lnk_sessionclients.ClientId')
  5. ->leftJoin('tbl_sessions','lnk_sessionclients.sessionID', '=', 'tbl_sessions.sessionID')
  6. ->leftJoin('tbl_users', 'tbl_sessions.userID', '=', 'tbl_users.userID')
  7. ->leftJoin('lnk_sessionstatus', 'lnk_sessionclients.sessionID', '=', 'lnk_sessionstatus.sessionID')
  8. ->select('tbl_clients.clientfirstname', 'tbl_clients.clientlastname', 'tbl_clients.createddate', 'tbl_clientphones.phonenumber', 'tbl_clientemails.emailaddress', 'tbl_users.userfirstname', 'tbl_users.userlastname', 'tbl_sessions.movedate', 'lnk_sessionstatus.statusID')
  9. ->limit(30)
  10. ->get();

客户端控制器:

  1. $clients = Client::query();
  2. $clients->select('ClientID', 'ClientFirstName', 'ClientLastName', 'createdDate')->where('ClientName', 'LIKE', "%{$name}%");
  3. $clients->with(array('sessionClients' => function($query)
  4. {
  5. $query->select('UserID','LNK_SessionClients.SessionID');
  6. $query->select('MoveDate','LNK_SessionClients.SessionID');
  7. $query->with(array('sources' => function($query)
  8. {
  9. $query->select('LKUP_Sources.SourceID','SourceName');
  10. }));
  11. }))
  12. ->has('sessionClients')->has('sessionClients.sources')->limit(10);

clients控制器得到正确的结果,但与db::table()查询相比不完整。我似乎不可能正确设置客户机模型来查询数据。我想使用雄辩模型的原因是1)急于加载,2)分页,3)运行的查询更少!当我在控制器中执行代码以返回客户机时,它运行大约50个查询以返回5个结果。装载时间很短。
建议?
更新了完整的客户模型关系。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题