首页 > 解决方案 > PHP Laravel - 通过搜索获取​​模型数组或返回空数组

问题描述

对 PHP 和 Laravel 来说非常新,所以这可能是一个菜鸟问题。

public function listForReportEvent(Request $request)
{
    $sites = $request->filled('name') ? $this->searchSiteByName($request->query('name')) : '';

    if (is_array($sites)) {
        return $sites->map(function (Site $site) {
            return [
                'text' => $site->study->ref_study_id . '-' . $site->site_number . ': ' . $site->name,
                'value' => $site->id,
            ];
        });
    } elseif (is_object($sites)) {
        return null;
    }
}

我知道$sites变量中有内容,但是当我dd($sites);实际返回一个值时,我什么也得不到。

有什么想法我做错了吗?

编辑:上面引用的另一个函数在这里(虽然不应该真的需要它)。

private function searchSiteByName(string $name): Collection
{
    return Site::query()
        ->where('name', 'LIKE', "%$name%")
        ->orWhere('site_number', 'LIKE', "%$name%")
        ->get();
}

dd($sites)结果:

Illuminate\Database\Eloquent\Collection {#1797
  #items: array:9 [
    0 => App\Models\Site {#1796
      #casts: array:11 [
        "name" => "string"
        "site_number" => "string"
        "description" => "string"
        "subject_planned_cnt" => "integer"
        "subject_enrolled_cnt" => "integer"
        "created_at" => "datetime"
        "updated_at" => "datetime"
        "created_by_id" => "integer"
        "updated_by_id" => "integer"
        "deleted_at" => "datetime"
        "deleted_by_id" => "integer"
      ]
      #appends: []
      #fillable: array:9 [
        0 => "study_id"
        1 => "site_number"
        2 => "name"
        3 => "subject_planned_cnt"
        4 => "subject_enrolled_cnt"
        5 => "patient_recruitment_status"
        6 => "closed"
        7 => "state_id"
        8 => "site_status_id"
      ]
      #CREATED_AT: "created_at"
      #UPDATE_AT: "updated_at"
      #dates: array:1 [
        0 => "deleted_at"
      ]
      -format: "M/j/Y - g:iA"
      #connection: "mysql"
      #table: "sites"
      #primaryKey: "id"
      #keyType: "int"
      +incrementing: true
      #with: []
      #withCount: []
      +preventsLazyLoading: false
      #perPage: 15
      +exists: true
      +wasRecentlyCreated: false
      #attributes: array:16 [
        "id" => 1
        "name" => "1001"
        "site_number" => "1001"
        "subject_planned_cnt" => 0
        "subject_enrolled_cnt" => 0
        "patient_recruitment_status" => null
        "closed" => 0
        "study_id" => 1
        "created_at" => null
        "updated_at" => null
        "created_by_id" => null
        "updated_by_id" => null
        "deleted_at" => null
        "deleted_by_id" => null
        "state_id" => 53
        "site_status_id" => 1
      ]
      #original: array:16 [
        "id" => 1
        "name" => "1001"
        "site_number" => "1001"
        "subject_planned_cnt" => 0
        "subject_enrolled_cnt" => 0
        "patient_recruitment_status" => null
        "closed" => 0
        "study_id" => 1
        "created_at" => null
        "updated_at" => null
        "created_by_id" => null
        "updated_by_id" => null
        "deleted_at" => null
        "deleted_by_id" => null
        "state_id" => 53
        "site_status_id" => 1
      ]
      #changes: []
      #classCastCache: []
      #dateFormat: null
      #dispatchesEvents: []
      #observables: []
      #relations: []
      #touches: []
      +timestamps: true
      #hidden: []
      #visible: []
      #guarded: array:1 [
        0 => "*"
      ]
      #forceDeleting: false
      #userstamping: true
    }
    1 => App\Models\Site {#1795
      #casts: array:11 [
        "name" => "string"
        "site_number" => "string"
        "description" => "string"
        "subject_planned_cnt" => "integer"
        "subject_enrolled_cnt" => "integer"
        "created_at" => "datetime"
        "updated_at" => "datetime"
        "created_by_id" => "integer"
        "updated_by_id" => "integer"
        "deleted_at" => "datetime"
        "deleted_by_id" => "integer"
      ]
      #appends: []
      #fillable: array:9 [
        0 => "study_id"
        1 => "site_number"
        2 => "name"
        3 => "subject_planned_cnt"
        4 => "subject_enrolled_cnt"
        5 => "patient_recruitment_status"
        6 => "closed"
        7 => "state_id"
        8 => "site_status_id"
      ]
      #CREATED_AT: "created_at"
      #UPDATE_AT: "updated_at"
      #dates: array:1 [
        0 => "deleted_at"
      ]
      -format: "M/j/Y - g:iA"
      #connection: "mysql"
      #table: "sites"
      #primaryKey: "id"
      #keyType: "int"
      +incrementing: true
      #with: []
      #withCount: []
      +preventsLazyLoading: false
      #perPage: 15
      +exists: true
      +wasRecentlyCreated: false
      #attributes: array:16 [
        "id" => 43
        "name" => "1001"
        "site_number" => "1001"
        "subject_planned_cnt" => 0
        "subject_enrolled_cnt" => 0
        "patient_recruitment_status" => null
        "closed" => 0
        "study_id" => 2
        "created_at" => null
        "updated_at" => null
        "created_by_id" => null
        "updated_by_id" => null
        "deleted_at" => null
        "deleted_by_id" => null
        "state_id" => 12
        "site_status_id" => 3
      ]
      #original: array:16 [
        "id" => 43
        "name" => "1001"
        "site_number" => "1001"
        "subject_planned_cnt" => 0
        "subject_enrolled_cnt" => 0
        "patient_recruitment_status" => null
        "closed" => 0
        "study_id" => 2
        "created_at" => null
        "updated_at" => null
        "created_by_id" => null
        "updated_by_id" => null
        "deleted_at" => null
        "deleted_by_id" => null
        "state_id" => 12
        "site_status_id" => 3
      ]

标签: phplaravel

解决方案


$sites是集合时$request->filled('name')true

在这种情况下,is_array($sites)将始终返回,false因为它不是 aarray而是 a Collection

这就是你陷入这个return null角色的原因。

你可以检查什么而不是is_array($sites)

public function listForReportEvent(Request $request)
{
    $sites = $request->filled('name') ? $this->searchSiteByName($request->query('name')) : '';


// if $sites isn't '' and isn't an empty collection, then map...
// else return null

    if ($sites && !$sites->isEmpty()) {
        return $sites->map(function (Site $site) {
            return [
                'text' => $site->study->ref_study_id . '-' . $site->site_number . ': ' . $site->name,
                'value' => $site->id,
            ];
        });
    } else {
        return null;
    }
}

推荐阅读