从Model中选择几列,并从其关系表中选择几列

时间:2017-06-16 02:04:42

标签: laravel laravel-5.3 laravel-5.4

用户模型

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();

但没有奏效。它显示了用户表中预期的三列,但没有关联记录的角色表中的信息。

什么遗失?

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

我想你可以试试这个:

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

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

希望这会对你有所帮助。

答案 2 :(得分:0)

with 的select(....)中添加与tblUser表的主键相关的tblRole表的外键。 然后列出您要获取的所有其他列。

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