我在使用Laravel 5和Eloquent时遇到了一些问题。我有3个模型userInfo,tasksAssign和taskCreated。 用户模型:
public function tasksAssign()
{
return $this->hasMany('App\Tasks', 'fk_user_id_assign', 'id')->where('status', 2);
}
public function tasksCreated()
{
return $this->hasMany('App\Tasks', 'fk_user_id_created', 'id');
}
任务模型
public function userInfo()
{
return $this->belongsTo('App\User');
//return $this->hasOne('App\User', 'id', 'id'); The hasOne here is just me testing diffrent stuff to see if i could get it to work.
}
Shoulndt我可以从我的User(URL中的WHERE id = id)中获取值,以显示在使用belongsTo()的任务show视图中?像这样:{{$tasks->userInfo->name}}
还是我完全离开这里?
更新: 当前任务控制器:
public function show($id)
{
$tasks = Tasks::findOrFail($id);
$assignee = $tasks->assignee;
return view('tasks.show')->withTasks($tasks);
}
和我的观点{{$tasks->assignee}}
,但它没有显示任何内容,我也试图获取受让人的信息,但是感谢所有的例子,它们将在以后有用。
和模型:
public function assignee() {
return $this->belongsTo('App\User', 'fk_user_assign_id', 'id');
}
答案 0 :(得分:3)
您希望在user_id
表格中有一个tasks
字段,其中user_id
应该引用id
表格中的users
列,例如:
// App\Task.php
public function userInfo()
{
// Laravel'll assume 'user_id' (fk) is available in tasks table
return $this->belongsTo('App\User');
}
或者,您可以明确告诉local key name
使用:
// App\Task.php
public function userInfo()
{
return $this->belongsTo('App\User', 'the_key_that_refers_to_users_table');
}
答案 1 :(得分:1)
好的,所以我假设你的架构看起来像这样:
Schema::create('user', function($table) {
$table->increments('id');
$table->string('name');
$table->timestamps();
});
Schema::create('task', function($table) {
$table->increments('id');
$table->integer('fk_user_id_assign')->unsigned();
$table->foreign('fk_user_id_assign')->references('id')->on('user');
$table->integer('fk_user_id_created')->unsigned();
$table->foreign('fk_user_id_created')->references('id')->on('user')
$table->timestamps();
});
在英语中,任务有一个创建者,并且有一个asignee。我不确定您尝试使用->userInfo()
关系访问哪个,因此我将描述访问方式。
因为您没有在user_id
表上使用名称task
作为外键,所以您需要指定要从中加载用户的外键。
class User extends Eloquent {
public function createdTasks() {
return $this->hasMany(Task::class, 'fk_user_created_id', 'id');
}
public function assignedTasks() {
return $this->hasMany(Task::class, 'fk_user_assign_id', 'id');
}
}
class Task extends Eloquent {
public function creator() {
return $this->belongsTo(User::class, 'fk_user_created_id', 'id');
}
public function assignee() {
return $this->belongsTo(User::class, 'fk_user_assign_id', 'id');
}
}
要获取给定用户创建的所有任务,请使用
$tasksCreatedByUser = $user->createdTasks;
要将所有任务分配给给定用户,请使用
$tasksAssignedToUser = $user->assignedTasks;
要为用户创建一个任务,请使用
$creator = $task->creator;
要为用户分配任务,请使用
$assignee = $task->assignee;
最后,如果您想要列出用户创建的每项任务的受让人,请执行类似
的操作$tasksCreatedByUser = $user->createdTasks;
foreach($tasksCreatedByUser as $task) {
$assignee = $task->assignee;
echo "Task #{$task->id} was created by user #{$user->id} and assigned to user #{$assignee->id}\n";
}
如果父模型具有->hasOne()
或->hasMany()
关系,则子模型必须具有互补的->belongsTo()
关系。在这种情况下,父模型是User
模型,子模型是Task
模型。
答案 2 :(得分:0)
当您使用belongsTo
时,Laravel将假定forgein键为'table_id'
并且在使用haseOne
或hasMany
时,Laravel会将其与s
一起假定为“ tables_id”
然后指定您自己的选择,您需要这样做
public function userInfo(){
return $this->belongsTo('App\User', 'your_onw_key');
}