从belongsTo()Laravel 5获取值

时间:2016-01-03 01:49:28

标签: laravel laravel-5 eloquent

我在使用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');
    }

3 个答案:

答案 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' 并且在使用haseOnehasMany时,Laravel会将其与s一起假定为“ tables_id” 然后指定您自己的选择,您需要这样做

public function userInfo(){
    return $this->belongsTo('App\User', 'your_onw_key');
}