2017-06-16 76 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();