选择"关系表"中的特定字段



我正在尝试在 3 个不同的表中选择某个字段,我不知道我是否必须使用 Query builer (我宁愿避免它(,或者我的模型上犯了一个错误

这是我的查询代码

$lobbies = Lobby::with(array('games' => function($query) {
$query->select('id','name');
}))
->with(array('users' => function($query){
$query->select('id', 'pseudo');
}))
->get();
return response()->json($lobbies);

它返回以下内容:

[
{
"id":2,
"description":"mon premier lobby",
"created_at":"2020-05-13 12:02:36",
"support_link":"https://discord.gg/K3NGfv4",
"nb_player":1,
"user_id":1,
"game_id":2,
"games":{
"name":"Counter-strike"
},
"users":{
"id":1,
"pseudo":"misakilou"
}
}
]

但我只需要描述、名称(游戏名称(、nb_player和伪字段,而不是其他字段

这是我的不同模型

用户模型

<?php
namespace App;
use IlluminateContractsAuthMustVerifyEmail;
use IlluminateFoundationAuthUser as Authenticatable;
use IlluminateNotificationsNotifiable;
use IlluminateSupportFacadesApp;
use IlluminateDatabaseEloquentModel;
class User extends Authenticatable
{
use Notifiable;
protected $table = 'users';
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'pseudo', 'mail', 'password','active','confirm_password'
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
public function lobbies(){
return $this->hasOne('AppLobby');
}
public function getUsernameAttribute(){
return $this->pseudo;
}
}

游戏模型

<?php
namespace App;
use IlluminateDatabaseEloquentModel;
class Game extends Model
{
//
protected $table = 'games';
protected $visible = [
'game_id','name', 'picture'
];
protected $fillable = [
'name', 'picture'
];
/*
public function users(){
return $this->HasMany('AppUser');
}
*/
public function lobbies(){
return $this->hasMany('AppLobby');
}

}

和大堂模型

<?php
namespace App;
use IlluminateDatabaseEloquentModel;
class Lobby extends Model
{
protected $table = 'lobbies';
public $timestamps = false;
//
protected $fillable = [
'description', 'created_at', 'nb_player' ,'support_link', 'user_id', 'game_id'
];
public function games(){
return $this->belongsTo('AppGame', 'game_id');
}
public function users(){
return $this->belongsTo('AppUser', 'user_id');
}
}

您可以向Lobby模型添加select,但请记住,必须选择外键才能使with正常工作。如果不希望该数据包含在响应中,则可以映射查询返回的集合,以便在返回响应之前对其进行自定义。像这样:

$lobbies = Lobby::select('id', 'description', 'nb_player', 'game_id', 'user_id')
->with(array('games' => function($query) {
$query->select('id','name');
}))
->with(array('users' => function($query){
$query->select('id', 'pseudo');
}))
->get();
$response = $lobbies->map(function ($lobby, $key) {
$item = [
'description' => $lobby->description,
'nb_player' => $lobby->nb_player,
'game_name' => $lobby->games->name,
'user_pseudo' => $lobby->users->pseudo,
];
return $item;
});
return response()->json($response);

如果要避免对集合进行后续映射,可以使用联接而不是 Eloquent 的关系。像这样:

$lobbies = Lobby::join('users', 'users.id', '=', 'lobbies.user_id')
->join('games', 'games.id', '=', 'lobbies.game_id')
->select('lobbies.description', 'lobbies.nb_player', 'users.pseudo', 'games.name')
->get();
return response()->json($lobbies);

最新更新