如何从三个相关的 table 及其模型关系中获取数据?
How to get data from three related table with it's model relationships?
我有三个这样的 table:
费用:-
- expense_id
- user_id
用户:-
- user_id
- employee_id
员工:-
- employee_id
- first_name
- last_name
我想从员工 table 那里得到 first_name
和 last_name
,其中 expense.user_id = user.user_id
,我尝试了类似下面的方法,但我没有得到正确的数据。
费用模型:-
public function users(){
return $this->hasOne(User::class,'user_id','user_id');
}
用户模型:-
public function employee(){
return $this->hasOne(Employee::class,'employee_id','user_id');
}
和员工模型:-
public function users()
{
return $this->belongsTo(User::class,'employee_id');
}
我打电话来看是这样的:-
<td>{{$expense->users->employee->first_name ." " . $expense->users->employee->last_name }}</td>
它显示数据,但不是预期的数据。
我的错误在哪里,应该怎么办?
请帮忙!
谢谢!
我建议您以这种方式重新设计数据库和关系:
Expense:-
id
user_id
User:-
id
Employee:-
id
user_id
first_name
last_name
对于BelongsTo
和HasOne
关系,请使用单名词:
class Expense extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
}
class User extends Model
{
public function employee()
{
return $this->hasOne(Employee::class);
}
}
class Employee extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
public function getFullNameAttribute()
{
return $this->first_name . ' ' . $this->last_name;
}
}
最后,您可以像这样访问员工的全名:
$expense->user->employee->full_name;
class Expense extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
}
class User extends Model
{
public function employee()
{
return $this->belongsTo(Employee::class);
}
}
class Employee extends Model
{
public function user()
{
return $this->hasOne(User::class);
}
public function getFullNameAttribute()
{
return $this->first_name . ' ' . $this->last_name;
}
}
然后访问客户属性:
<td>{{$expense->user->employee->full_name}}</td>
我认为你在滥用 eloquent 关系。
A one-to-many relationship is used to define relationships where a
single model is the parent to one or more child models.
试试这个。
use App\Models\Employee;
use App\Models\Expense;
// User model.
class User extends Authenticatable
{
use HasFactory, Notifiable;
protected $primaryKey = 'user_id';
protected $table = 'users';
public function employee()
{
return $this->hasOne(Employee::class, "employee_id", "employee_id");
}
public function expenses()
{
return $this->hasMany(Expense::class, "user_id", "user_id");
}
}
// Expense model
class Expense extends Model
{
use HasFactory;
protected $primaryKey = 'expense_id';
public function user()
{
return $this->belongsTo(User::class, "user_id", "user_id");
}
}
// Employee model.
class Employee extends Model
{
use HasFactory;
protected $primaryKey = 'employee_id';
public function user()
{
return $this->belongsTo(User::class, "employee_id", "employee_id");
}
}
// 'create_users_table' migration.
class CreateUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id('user_id');
$table->unsignedBigInteger("employee_id");
$table->timestamps();
$table->foreign("employee_id")
->references("employee_id")
->on("employees")
->onDelete("cascade");
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('users');
}
}
// 'create_expenses_table' migration.
class CreateExpensesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('expenses', function (Blueprint $table) {
$table->id('expense_id');
$table->unsignedBigInteger("user_id");
$table->timestamps();
$table->foreign("user_id")
->references("user_id")
->on("users")
->onDelete("cascade");
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('expenses');
}
}
// 'create_employees_table' migration.
class CreateEmployeesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('employees', function (Blueprint $table) {
$table->id("employee_id");
$table->string("first_name");
$table->string("last_name");
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('employees');
}
}
// Sample query 1.
App\Models\Expense::find(1)
->with(
["user" => function($query)
{
$query->with("employee");
}])
->first();
// Sample output 1.
/*
=> App\Models\Expense {#4172
expense_id: 1,
user_id: 1,
created_at: null,
updated_at: null,
user: App\Models\User {#4322
user_id: 1,
employee_id: 1,
created_at: null,
updated_at: null,
employee: App\Models\Employee {#4330
employee_id: 1,
first_name: "john",
last_name: "doe",
created_at: null,
updated_at: null,
},
},
}
*/
// Sample query 2.
App\Models\Expense::with(
["user" => function($query)
{$query->with("employee");
}])->get();
// Sample output 2.
/*
=> Illuminate\Database\Eloquent\Collection {#4318
all: [
App\Models\Expense {#4320
expense_id: 1,
user_id: 1,
created_at: null,
updated_at: null,
user: App\Models\User {#3382
user_id: 1,
employee_id: 1,
created_at: null,
updated_at: null,
employee: App\Models\Employee {#4335
employee_id: 1,
first_name: "john",
last_name: "doe",
created_at: null,
updated_at: null,
},
},
},
App\Models\Expense {#4323
expense_id: 2,
user_id: 1,
created_at: null,
updated_at: null,
user: App\Models\User {#3382},
},
],
}
*/
我有三个这样的 table:
费用:-
- expense_id
- user_id
用户:-
- user_id
- employee_id
员工:-
- employee_id
- first_name
- last_name
我想从员工 table 那里得到 first_name
和 last_name
,其中 expense.user_id = user.user_id
,我尝试了类似下面的方法,但我没有得到正确的数据。
费用模型:-
public function users(){
return $this->hasOne(User::class,'user_id','user_id');
}
用户模型:-
public function employee(){
return $this->hasOne(Employee::class,'employee_id','user_id');
}
和员工模型:-
public function users()
{
return $this->belongsTo(User::class,'employee_id');
}
我打电话来看是这样的:-
<td>{{$expense->users->employee->first_name ." " . $expense->users->employee->last_name }}</td>
它显示数据,但不是预期的数据。
我的错误在哪里,应该怎么办? 请帮忙! 谢谢!
我建议您以这种方式重新设计数据库和关系:
Expense:-
id
user_id
User:-
id
Employee:-
id
user_id
first_name
last_name
对于BelongsTo
和HasOne
关系,请使用单名词:
class Expense extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
}
class User extends Model
{
public function employee()
{
return $this->hasOne(Employee::class);
}
}
class Employee extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
public function getFullNameAttribute()
{
return $this->first_name . ' ' . $this->last_name;
}
}
最后,您可以像这样访问员工的全名:
$expense->user->employee->full_name;
class Expense extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
}
class User extends Model
{
public function employee()
{
return $this->belongsTo(Employee::class);
}
}
class Employee extends Model
{
public function user()
{
return $this->hasOne(User::class);
}
public function getFullNameAttribute()
{
return $this->first_name . ' ' . $this->last_name;
}
}
然后访问客户属性:
<td>{{$expense->user->employee->full_name}}</td>
我认为你在滥用 eloquent 关系。
A one-to-many relationship is used to define relationships where a single model is the parent to one or more child models.
试试这个。
use App\Models\Employee;
use App\Models\Expense;
// User model.
class User extends Authenticatable
{
use HasFactory, Notifiable;
protected $primaryKey = 'user_id';
protected $table = 'users';
public function employee()
{
return $this->hasOne(Employee::class, "employee_id", "employee_id");
}
public function expenses()
{
return $this->hasMany(Expense::class, "user_id", "user_id");
}
}
// Expense model
class Expense extends Model
{
use HasFactory;
protected $primaryKey = 'expense_id';
public function user()
{
return $this->belongsTo(User::class, "user_id", "user_id");
}
}
// Employee model.
class Employee extends Model
{
use HasFactory;
protected $primaryKey = 'employee_id';
public function user()
{
return $this->belongsTo(User::class, "employee_id", "employee_id");
}
}
// 'create_users_table' migration.
class CreateUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id('user_id');
$table->unsignedBigInteger("employee_id");
$table->timestamps();
$table->foreign("employee_id")
->references("employee_id")
->on("employees")
->onDelete("cascade");
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('users');
}
}
// 'create_expenses_table' migration.
class CreateExpensesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('expenses', function (Blueprint $table) {
$table->id('expense_id');
$table->unsignedBigInteger("user_id");
$table->timestamps();
$table->foreign("user_id")
->references("user_id")
->on("users")
->onDelete("cascade");
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('expenses');
}
}
// 'create_employees_table' migration.
class CreateEmployeesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('employees', function (Blueprint $table) {
$table->id("employee_id");
$table->string("first_name");
$table->string("last_name");
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('employees');
}
}
// Sample query 1.
App\Models\Expense::find(1)
->with(
["user" => function($query)
{
$query->with("employee");
}])
->first();
// Sample output 1.
/*
=> App\Models\Expense {#4172
expense_id: 1,
user_id: 1,
created_at: null,
updated_at: null,
user: App\Models\User {#4322
user_id: 1,
employee_id: 1,
created_at: null,
updated_at: null,
employee: App\Models\Employee {#4330
employee_id: 1,
first_name: "john",
last_name: "doe",
created_at: null,
updated_at: null,
},
},
}
*/
// Sample query 2.
App\Models\Expense::with(
["user" => function($query)
{$query->with("employee");
}])->get();
// Sample output 2.
/*
=> Illuminate\Database\Eloquent\Collection {#4318
all: [
App\Models\Expense {#4320
expense_id: 1,
user_id: 1,
created_at: null,
updated_at: null,
user: App\Models\User {#3382
user_id: 1,
employee_id: 1,
created_at: null,
updated_at: null,
employee: App\Models\Employee {#4335
employee_id: 1,
first_name: "john",
last_name: "doe",
created_at: null,
updated_at: null,
},
},
},
App\Models\Expense {#4323
expense_id: 2,
user_id: 1,
created_at: null,
updated_at: null,
user: App\Models\User {#3382},
},
],
}
*/