我正在学习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中有一些转身,所以我不确定我是否弄乱了那里的东西。基本上,我从登录用户拥有的任务中获得结果,但未分配给登录用户。
答案 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'));
}