Laravel dapatkan projek terkini yang diisih mengikut tarikh tamat projek
P粉773659687
P粉773659687 2023-09-11 21:38:55
0
1
501

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粉773659687
P粉773659687

membalas semua(1)
P粉258788831

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 调用而不是 whereHasorWhereHas 可能会在 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');
  }
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan