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

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

今天已经结束了,如果我的要求没有意义,请提前道歉。在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个结果。装载时间很短。
建议?
更新了完整的客户模型关系。

暂无答案!

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

相关问题