这是一天的结束,所以如果我问的话没有意义,请提前道歉。在Laravel 5.2中,我们有一个用户和客户端模型。用户可以拥有许多客户。客户端的所有数据都分布在三个或四个不同的表中,我们正在使用链接表。要从客户端的所有表中选择所有必要的数据,我有一个很长的查询来执行连接和选择。但是,我正在尝试使用Eloquent模型进行急切加载并遇到困难。
客户端模型与用户的关系:
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();
ClientController:
$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);
客户端控制器获取正确的结果,但与我的DB :: table()查询相比并不完整。我有一个看似不可能的时间来正确设置客户端模型来查询数据。我想使用Eloquent模型的原因是1)急切加载,2)分页,3)少运行查询!当我在我的控制器中执行代码以返回客户端时,它会运行大约50个查询以返回五个结果。加载时间非常糟糕。
建议?
更新了完整的客户端模型关系。