【问题标题】:Laravel 5 - Defining Two Relationships Between ModelsLaravel 5 - 定义模型之间的两种关系
【发布时间】:2019-05-07 09:52:12
【问题描述】:

我正在学习 Laravel,而且总体上是真正的 OOP。我关注了几个 YouTube 教程系列,教你在 Laravel 中创建博客。

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

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

用户.php

public function tasks()
{
    return $this->hasMany('App\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 中有点转身,所以我不确定我是否在上面搞砸了。基本上,我从登录用户拥有的任务中获取结果,但未分配给登录用户。

【问题讨论】:

    标签: laravel oop laravel-5 eloquent relationship


    【解决方案1】:

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

    任务.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();
    

    应该工作

    【讨论】:

      【解决方案2】:
      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'));
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-06
        • 2019-07-26
        • 1970-01-01
        • 2020-10-13
        • 2018-07-11
        • 2020-11-03
        相关资源
        最近更新 更多