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

しかし、機能しませんでした。これは、ユーザーテーブルから期待される3つの列を表示しますが、関連付けられたレコードのロールテーブルの情報は表示されません。

何かが欠落していますか?私はあなたがこの試すことができると思い

+0

実際に 'RoleID'という名前の' role'テーブルのキーはありますか? – Ohgodwhy

+0

はい。 RoleIDです。あなたが望むなら、私はスキーマを送ることができます。 – Pankaj

+0

だから、 'id'ではなく' RoleID'の主キーを持つテーブルロールがありますか? – 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列も選択しましたが、各ユーザーレコードの関係は常にnullです。 – Pankaj

+0

さらに重要なポイント... select文を削除してすべてのユーザ列をフェッチした場合にのみ、コードが機能します。 – Pankaj

+0

'UserModel' selectに' "RoleID" 'を追加しなければならないので、クエリを実行した後にロールを対応するユーザに付けることができます。 –

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

.... )はにはが追加されています.tblRoleテーブルの外部キーは、tblUserテーブルのプライマリキーに関連しています。 次に、フェッチしたい他のすべての列のリストを表示します。

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