【问题标题】:Get values from belongsTo() Laravel 5从 belongsTo() Laravel 5 中获取值
【发布时间】:2016-01-03 01:49:27
【问题描述】:

我在使用 Laravel 5 和 Eloquent 时遇到了一些问题。我有 3 个模型 userInfo、taskAssign 和 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.
}

我是否应该能够从我的用户(URL 中的 WHERE id = id)获取值以显示在我的任务显示视图中使用 belongsTo()?像这样:{{$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');
    }

【问题讨论】:

  • 任务表中存储用户 ID 的列的名称是什么?
  • fk_user_assign_id 是任务表中的那个
  • 我不知道这是您实际代码中的拼写错误,还是只是在问题中,但在您的hasMany 中,您的 fk 字段名称为fk_user_id_assign,但在@ 987654329@ 你有它作为fk_user_assign_id
  • 就是这样,谢谢! :)

标签: laravel laravel-5 eloquent


【解决方案1】:

您假设您的tasks 表中有一个user_id 字段,其中user_id 应该引用users 表中的id 列,例如:

// 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');
}

【讨论】:

  • 谢谢!我之前尝试过几次,但我无法将它输出到我的视图中,我是否还必须以某种方式在我的 TasksController 中引用它?还是我应该直接使用当前的控制器代码 $tasks = Tasks::findOrFail($id);返回视图('tasks.show')->withTasks($tasks);
  • 感谢您的帮助,我们的拼写错误,这就是它起作用的原因。
【解决方案2】:

好的,我假设您的架构如下所示:

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();
});

在英语中,任务有一个创建者,并且有一个受让人。我不确定您尝试使用->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 模型。

【讨论】:

  • 所以我想我也开始在这里赶上一点,编辑我的答案,以获得更好的格式。感谢你目前的帮助!帮助我更多地理解它。
【解决方案3】:

当你使用belongsTo 时,Laravel 会假设 forgein 键是 'table_id' 当使用haseOnehasMany 时,Laravel 将假定它是'tables_id' 和s 然后要指定您自己的选择,您需要这样做

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

【讨论】:

    猜你喜欢
    • 2015-11-29
    • 2017-06-08
    • 2017-06-07
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 2020-07-03
    相关资源
    最近更新 更多