复杂的模型关系难以在多个表中返回数据

时间:2018-04-10 22:07:51

标签: php mysql laravel eloquent laravel-5.2

这是一天的结束,所以如果我问的话没有意义,请提前道歉。在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个查询以返回五个结果。加载时间非常糟糕。

建议?

更新了完整的客户端模型关系。

0 个答案:

没有答案