今天已经结束了,如果我的要求没有意义,请提前道歉。在laravel5.2中,我们有一个用户和客户机模型。用户可以有许多客户端。客户机的所有数据都分布在三到四个不同的表中,我们使用的是链接表。为了从客户机的所有表中选择所有必需的数据,我有一个执行连接和选择的长查询。但是,我尝试使用雄辩的模型来处理急切的加载和有困难的情况。
客户端模型与用户的关系:
public function user() {
return $this->belongsTo('App\User');
}
public function clients() {
return $this->hasMany('App\Models\Clients', 'clientID');
}
public function session()
{
return $this->belongsToMany('App\Models\Session','LNK_SessionClients','ClientID','SessionID');
}
public function sessionClients()
{
return $this->belongsToMany('App\Models\Session','LNK_SessionClients','ClientID','SessionID');
}
public function addresses()
{
return $this->hasMany('App\Models\ClientAddress', 'ClientID');
}
public function phones()
{
return $this->hasMany('App\Models\ClientPhone', $this->primaryKey)->where('PhoneNumber', '!=' ,'');
}
public function clientPhoneNumbers() {
return $this->belongsTo('Client');
}
public function emails()
{
return $this->hasMany('App\Models\ClientEmail', $this->primaryKey)->where('EmailAddress', '!=' ,'');
}
public function getPhonesListAttribute()
{
$query = $this->phones()->where('PhoneNumber', '!=', '');
return ['count' => $query->count(), 'list' => $query->pluck('PhoneNumber')];
}
public function getEmailsListAttribute()
{
$query = $this->emails()->where('EmailAddress', '!=', '');
return ['count' => $query->count(), 'list' => $query->pluck('EmailAddress')];
}
我真正需要的是:
$clients = DB::table('tbl_clients')
->leftJoin('tbl_clientphones', 'tbl_clients.clientID', '=', 'tbl_clientphones.ClientId')
->leftJoin('tbl_clientemails', 'tbl_clients.clientID', '=', 'tbl_clientemails.ClientId')
->leftJoin('lnk_sessionclients', 'tbl_clients.clientID','=','lnk_sessionclients.ClientId')
->leftJoin('tbl_sessions','lnk_sessionclients.sessionID', '=', 'tbl_sessions.sessionID')
->leftJoin('tbl_users', 'tbl_sessions.userID', '=', 'tbl_users.userID')
->leftJoin('lnk_sessionstatus', 'lnk_sessionclients.sessionID', '=', 'lnk_sessionstatus.sessionID')
->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')
->limit(30)
->get();
客户端控制器:
$clients = Client::query();
$clients->select('ClientID', 'ClientFirstName', 'ClientLastName', 'createdDate')->where('ClientName', 'LIKE', "%{$name}%");
$clients->with(array('sessionClients' => function($query)
{
$query->select('UserID','LNK_SessionClients.SessionID');
$query->select('MoveDate','LNK_SessionClients.SessionID');
$query->with(array('sources' => function($query)
{
$query->select('LKUP_Sources.SourceID','SourceName');
}));
}))
->has('sessionClients')->has('sessionClients.sources')->limit(10);
clients控制器得到正确的结果,但与db::table()查询相比不完整。我似乎不可能正确设置客户机模型来查询数据。我想使用雄辩模型的原因是1)急于加载,2)分页,3)运行的查询更少!当我在控制器中执行代码以返回客户机时,它运行大约50个查询以返回5个结果。装载时间很短。
建议?
更新了完整的客户模型关系。
暂无答案!
目前还没有任何答案,快来回答吧!