php - 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
]
解决方案
$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;
}
}
推荐阅读
- c# - 客户端使用 SOAP 请求发送文件附件
- php - 如何根据用户选择功能更改在 echo 脚本中使用的给定 $variable 值
- sql - ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter#quote 是否可以防止 SQL 注入?
- svn - svn diff 失败并显示“无法显示:文件标记为二进制类型。” 即使文件的 svn:mime-type 属性设置为“text/plain”
- java - 是每个 JVM 的 Java WatchService 还是一个应用程序可以启动多个?
- java - 如何使用底页从片段回调到活动
- java - Hibernate 在尝试检索数据时抛出错误(分离的实体)
- javascript - 在 React 中不会触发 play() 方法(除非有点击事件)
- angular - 根据条件添加角度模块
- java - Xpath 在 Chrome 浏览器中工作,但相同的 Xpath 在 Firefox 浏览器中不工作