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

View File

@ -50,7 +50,10 @@ class ProjectTodoController extends Controller
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', [
'todos' => $todos->whereNull('completed_at')->values(),

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -29,19 +29,4 @@ class Pomo extends Model
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",
];
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
{
return $this->belongsToMany(

View File

@ -58,33 +58,10 @@ class User extends Authenticatable
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
{
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();
}
}