从 Laravel 中具有一对一关系的表中获取数据
Get data from to tables with one to one relation in Laravel
我正在处理我的第一个 Laravel 项目,我想创建一个带有框架的 REST Api,以便 AngularJS 使用它。在我的系统中,我有两种类型的用户:用户 A 和 用户 B。我想使用默认 Laravel 的用户 table 来处理身份验证,并创建另外两个 tables,usera 和 userb,每个都有一列 user_id 是用户 table.
的外键
我将仅使用用户 table 来解释我的问题。我的迁移是这样的:
用户table
//users table migration
class CreateUsersTable extends Migration
{
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
...
}
用户table
class CreateUserA extends Migration
{
public function up()
{
Schema::create('usera', function(Blueprint $table){
$table->increments('id');
$table->string('document_number')
$table->integer('user_id')->unsigned();
$table->foreign('user_id')
->references('id')
->on('users')
->onDelete('cascade');
$table->timestamps();
});
}
...
}
在 UserA 模型中 class 我做到了:
class UserA extends Model
{
protected $fillable = array('id', 'document_number', 'user_id');
protected $hidden = array('created_at', 'updated_at');
public function user(){
$this->belongsTo('App\User');
}
}
因此,我使用API 方法创建了一个UsersA 控制器,并配置了访问相应功能的路由。 'api/usersa/' url 通过 GET 重定向到我的控制器的索引功能,功能是这样的:
public function index($id = null) {
if ($id == null) {
return UserA::orderBy('id', 'asc')->get();
}else{
return Usuario::find($id);
}
}
有了这个,我可以获得 usersa table 数据,但我想合并 users 和 usersa table,并得到类似这样的响应:
[
{
'id': 1,
'name': 'foo',
'email': 'foo@bar.com',
'document_number': '1234'
}
]
我该怎么做?
一定要这么平吗?最简单的解决方案是:
public function index($id = null) {
if ($id == null) {
return UserA::with('user')->orderBy('id', 'asc')->get();
}else{
return Usuario::with('usera')->find($id); // or whatever the relation name is.
}
}
我正在处理我的第一个 Laravel 项目,我想创建一个带有框架的 REST Api,以便 AngularJS 使用它。在我的系统中,我有两种类型的用户:用户 A 和 用户 B。我想使用默认 Laravel 的用户 table 来处理身份验证,并创建另外两个 tables,usera 和 userb,每个都有一列 user_id 是用户 table.
的外键我将仅使用用户 table 来解释我的问题。我的迁移是这样的:
用户table
//users table migration
class CreateUsersTable extends Migration
{
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
...
}
用户table
class CreateUserA extends Migration
{
public function up()
{
Schema::create('usera', function(Blueprint $table){
$table->increments('id');
$table->string('document_number')
$table->integer('user_id')->unsigned();
$table->foreign('user_id')
->references('id')
->on('users')
->onDelete('cascade');
$table->timestamps();
});
}
...
}
在 UserA 模型中 class 我做到了:
class UserA extends Model
{
protected $fillable = array('id', 'document_number', 'user_id');
protected $hidden = array('created_at', 'updated_at');
public function user(){
$this->belongsTo('App\User');
}
}
因此,我使用API 方法创建了一个UsersA 控制器,并配置了访问相应功能的路由。 'api/usersa/' url 通过 GET 重定向到我的控制器的索引功能,功能是这样的:
public function index($id = null) {
if ($id == null) {
return UserA::orderBy('id', 'asc')->get();
}else{
return Usuario::find($id);
}
}
有了这个,我可以获得 usersa table 数据,但我想合并 users 和 usersa table,并得到类似这样的响应:
[
{
'id': 1,
'name': 'foo',
'email': 'foo@bar.com',
'document_number': '1234'
}
]
我该怎么做?
一定要这么平吗?最简单的解决方案是:
public function index($id = null) {
if ($id == null) {
return UserA::with('user')->orderBy('id', 'asc')->get();
}else{
return Usuario::with('usera')->find($id); // or whatever the relation name is.
}
}