Laravel 5-定义模型之间的两个关系

时间:2018-12-05 18:49:23

标签: laravel oop laravel-5 eloquent relationship

我正在学习Laravel,实际上是OOP。我遵循了多个YouTube教程系列,教您如何在Laravel中创建博客。

我正在为啤酒厂构建任务应用程序,并且试图定义用户与任务之间的关系。因此,我有两个模型:User.php和Task.php。我在hasMany任务关系中定义用户没有问题,相反,任务属于用户。我感到困惑的是,我也希望用户也属于该任务。我有两个MySQL列,一列的标题为“ user_id”,另一列的标题为“ user_assigned_id”。我想要的是一个用户有许多任务,但是一个任务也有一个分配的用户,这个想法是创建任务的用户可以将任务分配给另一个用户。我找到了一些有关在三个模型之间创建关系的教程,例如一个用户拥有多条消息,但只有一个地址,因此我认为我可以将两个模型视为三个模型,然后将User模型连接回hasOne关系中的Task模型,但要传递到Controller和View确实很困难。

以下是每个文件中的相关代码:

User.php

public function tasks()
{
    return $this->hasMany('App\Task');
}

Task.php

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

//  Added an user_assigned_id relationship
public function user_assigned()
{
    return $this->hasOne('App\User', 'name', 'user_assigned_id');
}

DashboardController.php

public function index()
{
    $user_id = auth()->user()->id;
    $now = Carbon::now();

    $tasks_assigned = Task::orderBy('date', 'asc')->whereDate('date', '>=', $now)->where('user_assigned_id', '=', $user_id)->user_assigned()->where('name', '=', 1)->get();

    $tasks_created = Task::orderBy('date', 'asc')->whereDate('date', '>=', $now)->where('user_id', '=', $user_id)->get();

    return view('dashboard')->with('tasks_assigned', $tasks_assigned)->with('tasks_created', $tasks_created);
}

我在Controller中有一些转身,所以我不确定我是否弄乱了那里的东西。基本上,我从登录用户拥有的任务中获得结果,但未分配给登录用户。

2 个答案:

答案 0 :(得分:1)

您只需添加在Task.php模型上定义的第二个关系,然后根据user_assigned_id分配其他代理。您可以通过Eloquent进行预期的操作。

Task.php

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

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

然后在DashboardController.php

    $tasks_assigned = Task::orderBy('date', 'asc')->whereDate('date', '>=', $now)->where('user_assigned_id', '=', $user_id)->get();

应该工作

答案 1 :(得分:0)

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

//  Added an user_assigned_id relationship
public function assignee()
{
    return $this->belongsTo('App\User', 'user_assigned_id');
}

关系仍然是belongsTo,您只需要提供保存外键的列即可。

其他文件:

User.php

public function ownedTasks()
{
    return $this->hasMany('App\Task');
}

public function assignedTasks()
{
    return $this->hasMany('App\Task', 'user_assigned_id');
}

仪表板控制器

public function index()
{
    $now = Carbon::now();

    $tasks_assigned = Auth::user()->assignedTasks()->where('date', '>=', $now)->get();

    $tasks_created = Auth::user()->ownedTasks()->where('date', '>=', $now)->get();

    return view('dashboard')->with(compact('tasks_assigned', 'tasks_created'));
}