fix(Eloquent relationship notation):

Removed:
- Unwanted DB calls

Modified:
- Controllers and views to use model relationships
This commit is contained in:
devoalda 2023-08-13 16:45:31 +08:00
parent 917db15e78
commit b4948481e8
10 changed files with 48 additions and 101 deletions

View File

@ -41,12 +41,11 @@ class ProjectController extends Controller
$user = User::find(auth()->user()->id); $user = User::find(auth()->user()->id);
$projects = $user->projects()->paginate(4); $projects = $user->projects()->paginate(4);
// Aggregate all todos for all projects
$todos = $user->todos() // Aggregate all todos for all projects
->map(function ($todo) { $todos = $user->projects->map(function ($project) {
return Todo::find($todo->id); return $project->todos;
}); })->flatten();
if ($request->ajax()) { if ($request->ajax()) {
$view = view('project.load-projects', compact('projects'))->render(); $view = view('project.load-projects', compact('projects'))->render();
@ -60,7 +59,6 @@ class ProjectController extends Controller
'projects' => $projects, 'projects' => $projects,
'todos' => $todos->whereNull('completed_at')->values(), 'todos' => $todos->whereNull('completed_at')->values(),
'completed' => $todos->whereNotNull('completed_at') 'completed' => $todos->whereNotNull('completed_at')
->whereBetween('completed_at', [strtotime('today midnight'), strtotime('today midnight + 1 day')])
->values(), ->values(),
]); ]);
} }

View File

@ -50,7 +50,10 @@ class ProjectTodoController extends Controller
return new TodoResource($todos); return new TodoResource($todos);
} }
$todos = $project->todos; // "Todo index" shows all Todos for all Project
$todos = $user->projects->map(function ($project) {
return $project->todos;
})->flatten();
return view('todo.index', [ return view('todo.index', [
'todos' => $todos->whereNull('completed_at')->values(), 'todos' => $todos->whereNull('completed_at')->values(),

View File

@ -13,13 +13,11 @@ class CompletedTodo extends Component
public function mount() public function mount()
{ {
$this->todo_completed_count = DB::table('todos') $user = auth()->user();
->join('project_todo', 'todos.id', '=', 'project_todo.todo_id') $this->todo_completed_count = $user->projects->map(function ($project) {
->join('project_user', 'project_todo.project_id', '=', 'project_user.project_id') return $project->todos->whereNotNull('completed_at')->count();
->where('project_user.user_id', '=', Auth::user()->id) })->sum();
->whereDate('due_end', '<=', strtotime('today midnight'))
->whereNotNull('completed_at')
->count();
} }
public function render() public function render()

View File

@ -12,13 +12,11 @@ class IncompleteTodo extends Component
public function mount() public function mount()
{ {
$this->incomplete_count = DB::table('todos') $user = Auth::user();
->join('project_todo', 'todos.id', '=', 'project_todo.todo_id')
->join('project_user', 'project_todo.project_id', '=', 'project_user.project_id') $this->incomplete_count = $user->projects->map(function ($project) {
->where('project_user.user_id', '=', Auth::user()->id) return $project->todos->where('completed_at', null)->count();
->whereDate('due_end', '<=', strtotime('today midnight')) })->sum();
->whereNull('completed_at')
->count();
} }
public function render() public function render()

View File

@ -12,17 +12,24 @@ class PomoCount extends Component
public function mount(){ public function mount(){
$user = User::find(auth()->user()->id); $user = User::find(auth()->user()->id);
$todos = $user->todos()->map(function ($todo) { $todos = $user->projects->map(function ($project) {
$todo = \App\Models\Todo::find($todo->id); return $project->todos;
$todo->pomos = Pomo::where('todo_id', $todo->id); })->flatten();
return $todo;
}); // $todos = $user->todos()->map(function ($todo) {
// $todo = \App\Models\Todo::find($todo->id);
// $todo->pomos = Pomo::where('todo_id', $todo->id);
// return $todo;
// });
// Get the average pomo count per todo // Get the average pomo count per todo
$ave_pomo_count = $todos->avg(function ($todo) { $ave_pomo_count = 0;
return $todo->pomos->count(); foreach ($todos as $todo) {
}); $ave_pomo_count += $todo->pomo->count();
$this->ave_pomo_count = $ave_pomo_count ?? 0; }
$ave_pomo_count = $ave_pomo_count / $todos->count();
$this->ave_pomo_count = $ave_pomo_count;
} }
public function render() public function render()

View File

@ -19,12 +19,11 @@ class PomoTime extends Component
$user = User::find(auth()->user()->id); $user = User::find(auth()->user()->id);
// Get all pomos and calculate the average time spent per todo (due_end - due_start)/count/total pomos // Get all pomos and calculate the average time spent per todo (due_end - due_start)/count/total pomos
$pomos = $user->pomos(); $pomos = $user->projects->map(function ($project) {
$pomos = $pomos->map(function ($pomo) { return $project->todos->map(function ($todo) {
$pomo->todo = Todo::find($pomo->todo_id); return $todo->pomo;
$pomo->project = Project::find($pomo->todo->project_id); });
return $pomo; })->flatten();
});
$total_pomos = $pomos->count(); $total_pomos = $pomos->count();

View File

@ -2,6 +2,7 @@
namespace App\Http\Livewire\Todo; namespace App\Http\Livewire\Todo;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Livewire\Component; use Livewire\Component;
use App\Models\Todo; use App\Models\Todo;
@ -21,26 +22,20 @@ class TodaysTodo extends Component
public function render() public function render()
{ {
$todos = DB::table('todos') $user = auth()->user();
->join('project_todo', 'todos.id', '=', 'project_todo.todo_id')
$todos = Todo::join('project_todo', 'todos.id', '=', 'project_todo.todo_id')
->join('project_user', 'project_todo.project_id', '=', 'project_user.project_id') ->join('project_user', 'project_todo.project_id', '=', 'project_user.project_id')
->where('project_user.user_id', '=', auth()->user()->id) ->where('project_user.user_id', '=', $user->id)
->whereDate('due_end', '<=', strtotime('today midnight')) ->whereDate('due_end', '<=', now()->toDateString())
->whereNull('completed_at') ->whereNull('completed_at')
->orderBy('due_end', 'asc') ->orderBy('due_end', 'asc')
->paginate($this->perPage); ->paginate($this->perPage);
$incomplete_count = Todo::join('project_todo', 'todos.id', '=', 'project_todo.todo_id')
$todos->transform(function ($todo) {
return Todo::find($todo->id);
});
$incomplete_count = DB::table('todos')
->join('project_todo', 'todos.id', '=', 'project_todo.todo_id')
->join('project_user', 'project_todo.project_id', '=', 'project_user.project_id') ->join('project_user', 'project_todo.project_id', '=', 'project_user.project_id')
->where('project_user.user_id', '=', auth()->user()->id) ->where('project_user.user_id', '=', $user->id)
->whereDate('due_end', '<=', strtotime('today midnight')) ->whereDate('due_end', '<=', now()->toDateString())
->whereNull('completed_at') ->whereNull('completed_at')
->count(); ->count();

View File

@ -29,19 +29,4 @@ class Pomo extends Model
return $this->belongsTo(Todo::class); return $this->belongsTo(Todo::class);
} }
public function user(): Collection
{
return DB::table('users')
->join('project_user', 'users.id', '=', 'project_user.user_id')
->join('projects', 'project_user.project_id', '=', 'projects.id')
->join('project_todo', 'projects.id', '=', 'project_todo.project_id')
->join('todos', 'project_todo.todo_id', '=', 'todos.id')
->join('pomos', 'todos.id', '=', 'pomos.todo_id')
->where('pomos.id', '=', $this->id)
->select('users.*')
->get();
}
} }

View File

@ -38,19 +38,6 @@ class Todo extends Model
"updated_at" => "integer", "updated_at" => "integer",
]; ];
public function user(): Collection
{
// Select User given Todo
return DB::table('users')
->join('project_user', 'users.id', '=', 'project_user.user_id')
->join('projects', 'project_user.project_id', '=', 'projects.id')
->join('project_todo', 'projects.id', '=', 'project_todo.project_id')
->join('todos', 'project_todo.todo_id', '=', 'todos.id')
->where('todos.id', '=', $this->id)
->select('users.*')
->get();
}
public function projects(): BelongsToMany public function projects(): BelongsToMany
{ {
return $this->belongsToMany( return $this->belongsToMany(

View File

@ -58,33 +58,10 @@ class User extends Authenticatable
return $this->belongsToMany(Project::class, projectUser::class, 'user_id', 'project_id'); return $this->belongsToMany(Project::class, projectUser::class, 'user_id', 'project_id');
} }
public function todos(): Collection
{
return DB::table('todos')
->join('project_todo', 'todos.id', '=', 'project_todo.todo_id')
->join('projects', 'project_todo.project_id', '=', 'projects.id')
->join('project_user', 'projects.id', '=', 'project_user.project_id')
->join('users', 'project_user.user_id', '=', 'users.id')
->where('users.id', '=', $this->id)
->select('todos.*')
->get();
}
public function pomo(): HasManyThrough public function pomo(): HasManyThrough
{ {
return $this->hasManyThrough(Pomo::class, Todo::class); return $this->hasManyThrough(Pomo::class, Todo::class);
} }
public function pomos(): Collection
{
return DB::table('pomos')
->join('todos', 'pomos.todo_id', '=', 'todos.id')
->join('project_todo', 'todos.id', '=', 'project_todo.todo_id')
->join('projects', 'project_todo.project_id', '=', 'projects.id')
->join('project_user', 'projects.id', '=', 'project_user.project_id')
->join('users', 'project_user.user_id', '=', 'users.id')
->where('users.id', '=', $this->id)
->select('pomos.*')
->get();
}
} }