2017-06-16 70 views
1

用戶模型選擇幾列,並選擇幾列從關係表

class UserModel extends Authenticatable 
{ 

    use Notifiable; 

    public $table = 'tbluser'; 
    public $primaryKey = 'UserID'; 
    public $timestamps = true; 

    public function Role() { 
     return $this->hasOne("\App\Models\User\Role\RoleModel", "RoleID", "RoleID"); 
    } 
} 

角色模型

class RoleModel extends Model 
{ 
    public $table = 'tblrole'; 
    public $primaryKey = 'RoleID'; 
    public $timestamps = false;   
} 

我的代碼是會從兩個表中的所有列。下面的代碼顯示了從用戶表中的所有列,並從關係表中的所有列 - 角色

$data = UserModel::with("Role")->get(); 

我想下面的代碼從兩個表中選擇幾列。

$data = UserModel 
    ::select("UserName", "EmailAddress", "LastName") 
    ->with(['Role' => function ($q) { 
       $q->select('Role') 
      }]) 
    ->get(); 

但沒有工作。它根據用戶表顯示了三列,但沒有來自角色表的相關記錄的信息。

遺漏了什麼?

+0

實際上名爲RoleID的'role'表的關鍵是? – Ohgodwhy

+0

是的。它是RoleID。如果你願意,我可以發送模式。 – Pankaj

+0

所以你有一個表角色,主鍵是'RoleID'而不是'id'? – Ohgodwhy

回答

3

在您的with調用中,您需要從Role模型中選擇主鍵,以便在查詢後檢索角色時將角色掛接。除此之外,選擇在傳遞給with方法關閉想要的任何其他列:

$data = UserModel::select("UserName", "EmailAddress", "LastName") 
    ->with(['Role' => function ($q) { 
       $q->select('RoleID', 'Role', 'OtherColumn') 
      }]) 
    ->get(); 

然後你就可以訪問用戶和角色有:

// This will return the first user 
$user = $data->first(); 

// This returns the entire user role model with the selected columns 
$role = $user->Role; 

// Access Role attributes through the Role Model 
$role->Role; 
+0

我還在with調用中選擇了RoleID列,但對於每個用戶記錄,關係始終爲空。 – Pankaj

+0

更重要的一點......只有當我刪除select語句並獲取所有用戶列時,您的代碼才能正常工作。 – Pankaj

+0

您必須將''RoleID''添加到'UserModel'選擇中,以便在查詢運行后角色可以附加到相應的用戶。 –

1

我想你可以試試這個:

$data = UserModel 
    ::select("UserName", "EmailAddress", "LastName") 
    ->with(['tblrole' => function ($q) { 
       $q->select('Role') 
      }]) 
    ->get(); 

OR

$data = DB::table('tblrole')->select('tblrole.*','tbluser.UserName','tbluser.EmailAddress','tbluser.LastName') 
     ->join('tbluser','tbluser.id','=','tblrole.user_id') 
     ->get(); 

希望這有助於你。

+0

第一部分與我在我的問題中寫的相同。我錯過了什麼嗎?它不起作用。「 – Pankaj

0

在你選擇(.... )的添加與tblUser表的主鍵相關的tblRole表的外鍵。 然後列出您想要獲取的所有其他列。

$data = UserModel 
     ::select("UserName", "EmailAddress", "LastName") 
     ->with(['Role' => function ($q) { 
        $q->select('RoleID', 'Role') 
       }]) 
     ->get();