Laravel 5 - Определение двух отношений между моделями - PullRequest
0 голосов
/ 05 декабря 2018

Я изучаю Laravel, и действительно ООП в целом.Я следил за несколькими сериями руководств на YouTube, которые научили вас создавать блог в Laravel.

Я создаю приложение для пивоваренного завода и пытаюсь определить отношения между пользователями изадачи.Итак, у меня есть две модели: User.php и Task.php.У меня не было проблем с определением пользователя в отношении задач hasMany, и, наоборот, задача принадлежит пользователю.Что меня смущает, так это то, что я хотел бы, чтобы пользователь тоже относился к этой задаче.У меня есть два столбца MySQL, один с заголовком «user_id», а другой с «user_assigned_id».Я хочу, чтобы у пользователя было много задач, но у задачи также есть один назначенный пользователь, идея в том, чтобы пользователь, создавший задачу, мог назначить задачу другому пользователю.Я нашел несколько учебных пособий по созданию отношений между тремя моделями, например, пользователю, владеющему несколькими сообщениями, но имеющему только один адрес, поэтому я решил, что могу просто обработать две модели, как если бы они были тремя моделями, и подключить модель пользователя обратно кмодель задачи в отношении hasOne, но мне очень трудно передать ее в 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);
}

Я немного повернулся в контроллере, так что я неуверен, что я что-то там испортил.По сути, я получаю результаты от задач, принадлежащих зарегистрированному пользователю, но не назначенных зарегистрированному пользователю.

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Вы можете просто добавить второе отношение, определенное в вашей 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();

должно работать

0 голосов
/ 05 декабря 2018
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'));
}
...