Rumah > Soal Jawab > teks badan
Saya perlu menulis skop untuk mendapatkan item untuk pengguna yang sedang log masuk. Jika pengguna yang sedang log masuk mempunyai kebenaran melihat semua projek maka saya ingin menyenaraikan semua projek dalam sistem, jika tidak, saya ingin menyenaraikan projek yang dibuat oleh pengguna yang log masuk atau diberikan oleh tugas dalam pengguna. Saya cuba menulis julat berikut dalam model Project
:
public function scopeForUser($query, User $user) { if ($user->can('view-all-projects')) { return $query->withBudget() ->with(['customer:id,company_id' => ['company:id,name']]) ->latest() ->orderBy('end_date', 'desc'); } return $query->withBudget() ->with(['customer:id,company_id' => ['company:id,name']]) ->where(function ($query) use ($user) { $query->where('user_id', $user->id) ->orWhereHas('users', function ($query) use ($user) { $query->where('users.id', $user->id); }) ->orWhereHas('tasks', function ($query) use ($user) { $query->where('user_id', $user->id); }); }) ->latest() ->orderBy('end_date', 'desc'); }Rangkaian
withBudget
adalah seperti berikut
public function scopeWithBudget($query) { return $query->addSelect(['budget' => function ($subQuery) { $subQuery->selectRaw('sum(cost)') ->from('tasks') ->whereColumn('project_id', 'projects.id'); }]); }
Setakat ini ia berfungsi, tetapi ia tidak tepat. Kadang-kadang apabila saya tahu pengguna yang log masuk adalah pentadbir dan mempunyai semua kebenaran, ia hanya mendapat beberapa item dan item juga disusun mengikut tertib menurun, saya rasa created_at
bukannya tarikh_akhir< /代码>
Ada idea bagaimana untuk menyelesaikan masalah ini? Jika anda memerlukan maklumat lanjut sila beritahu saya
Edit Jika saya mengalih keluar beberapa pertanyaan, coretan kod berikut berfungsi:
if ($user->hasPermissionTo('view-all-projects')) { return $query->latest(); } else { return $query->where(function ($query) use ($user) { $query->where('user_id', $user->id) ->orWhereIn('id', function ($query) use ($user) { $query->select('project_id') ->from('tasks') ->where('user_id', $user->id); }); }); }
Kemudian saya mendapatkan item melalui:
<?php namespace App\Actions; use App\Models\Project; // use Illuminate\Support\Collection; use Illuminate\View\View; class ListProjects { public function __invoke(): View { $projects = Project::forUser(auth()->user())->get(); return view('projects.index', ['projects' => $projects, 'projectsCount' => $projects->count()]); } }
Sementara coretan kod di atas berfungsi, ia tidak melakukan satu perkara (lupakan tentang pemuatan bersemangat buat masa ini) tetapi saya perlu menyenaraikan item berdasarkan baki masa sebelum tarikh akhir. Oleh itu, ia harus menyenaraikan dalam pesanan item yang akan dibayar tidak lama lagi, item yang mempunyai lebih masa, item yang sudah perlu dibayar
P粉2587888312023-09-12 16:58:05
Saya rasa masalah pesanan mungkin anda sedang membuat panggilan latest()
以及 orderBy('end_date', 'desc')
作为 latest()
工作于 created_at
。您可能根本不需要 latest()
kerana anda masih menambah pesanan anda sendiri.
Bagi isu skop pengguna, saya tertanya-tanya sama ada penggunaan dua orWhereHas
调用而不是 whereHas
和 orWhereHas< /code> 可能会在
scopeForUser
anda menyebabkan masalah.
Mungkin pendekatan lain boleh kelihatan seperti ini:
public function scopeForUser($query, User $user) { if ($user->can('view-all-projects')) { return $query->withBudget() ->with(['customer:id,company_id' => ['company:id,name']]) ->orderBy('end_date', 'desc'); } return $query->withBudget() ->with(['customer:id,company_id' => ['company:id,name']]) ->where('user_id', $user->id) ->orWhere(function ($query) use ($user) { $query->whereHas('users', function ($query) use ($user) { $query->where('users.id', $user->id); }) ->orWhereHas('tasks', function ($query) use ($user) { $query->where('user_id', $user->id); }); }) ->orderBy('end_date', 'desc'); }