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
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 可能会在
scopeForUser
anda menyebabkan masalah.Mungkin pendekatan lain boleh kelihatan seperti ini: