Return 集一无 "Trying to get property of non-object" 错误
Return collection of one without "Trying to get property of non-object" error
我有一个 SearchController,我在其中检查两个 table 的搜索词,首先是完全匹配(然后重定向 table 到相关制造商页面),然后是部分匹配 -一共四个条件。除了最后一个,所有这些条件都有效,可能是因为它通常需要 return 集合中的一个结果。
我需要这种情况,因为我想在整个视图中执行 $results->slug
、$results->name
等操作,无论触发哪个搜索条件。目前我可以这样做来访问除第三个条件之外的所有条件的搜索结果。
搜索控制器 class,其中除第三个条件外的所有内容都正常工作:
class SearchController extends Controller
{
public function index() {
if (request("search")) {
# Works as expected
$exact_terms = SearchTerm::with("manufacturer")->where('term', request("search"))->get();
if($exact_terms->isNotEmpty()) {
echo "Exact search term match!";
$results = $exact_terms;
foreach ($results as $result) {
$slug = $result->manufacturer->slug;
}
return redirect()->action([ManufacturerController::class, 'index'], ["manufacturer" => $slug]);
}
# Works as expected
$exact_make = Manufacturer::where('slug', request("search"))->get();
if($exact_make->isNotEmpty()) {
echo "Exact manufacturer match!";
$results = $exact_make;
foreach ($results as $result) {
$slug = $result->slug;
}
return redirect()->action([ManufacturerController::class, 'index'], ["manufacturer" => $slug]);
}
# Doesn't work
$search_terms = SearchTerm::with("manufacturer")->where('term', "like", '%' . request("search") . '%')->get()->unique("manufacturers");
if($search_terms->isNotEmpty()) {
echo "Search term match!";
foreach ($search_terms as $search_term) {
$search_term = $search_term->manufacturer;
}
$results = collect($search_term);
}
# Works as expected
$search_make = Manufacturer::where('slug', 'like', '%' . request("search") . '%')->get();
if($search_make->isNotEmpty()) {
echo "Manufacturer match!";
$results = $search_make;
}
$results = isset($results) ? $results : collect();
}
return view("search", [
"manufacturer" => $manufacturer,
"results" => $results,
]);
}
}
查看文件:
@if($results)
<h1 class="my-5"> {{ $results->count() }} {{ $results->count() == 1 ? "result" : "results" }} found for <i>{{ request("search") }}</i></h1>
@foreach ($results as $result)
{{ $result->slug }}
@endforeach
@else
<p><h1>Sorry! We couldn't find any results for <i>"{{ request("search") }}"</i>.</h1></p>
@endif
在 foreach
循环之前触发条件时 dd($results)
的结果:
Illuminate\Support\Collection {#1406 ▼
#items: array:5 [▼
"id" => 15
"slug" => "ford"
"name" => "Ford"
"created_at" => "2022-01-28T19:53:28.000000Z"
"updated_at" => "2022-01-28T19:53:28.000000Z"
]
#escapeWhenCastingToString: false
}
触发 foreach
循环内部条件时 dd($result)
的结果(除了主键外,数组中什么也没有显示):
15
您不能通过构造函数将模型添加到集合中,它最终会从中提取属性,因为模型是 Arrayable
(它将调用 toArray
并获取attributes/appends/relationships 作为一个数组)。您可以在集合上调用 add
来添加模型。
$results = collect()->add($search_term);
或者您可以将数组传递给它期望的 collect
:
$results = collect([$search_term]);
附带说明一下,您正在进行大量迭代以仅从 Collection 中获取最后一个值以在所有这些条件下使用。您可以在集合上调用 last
以获取最后一个值,或者甚至将查询限制为 return 单个结果而不是整个结果集,因为您实际上没有使用任何结果集,除了最后一条记录。
我有一个 SearchController,我在其中检查两个 table 的搜索词,首先是完全匹配(然后重定向 table 到相关制造商页面),然后是部分匹配 -一共四个条件。除了最后一个,所有这些条件都有效,可能是因为它通常需要 return 集合中的一个结果。
我需要这种情况,因为我想在整个视图中执行 $results->slug
、$results->name
等操作,无论触发哪个搜索条件。目前我可以这样做来访问除第三个条件之外的所有条件的搜索结果。
搜索控制器 class,其中除第三个条件外的所有内容都正常工作:
class SearchController extends Controller
{
public function index() {
if (request("search")) {
# Works as expected
$exact_terms = SearchTerm::with("manufacturer")->where('term', request("search"))->get();
if($exact_terms->isNotEmpty()) {
echo "Exact search term match!";
$results = $exact_terms;
foreach ($results as $result) {
$slug = $result->manufacturer->slug;
}
return redirect()->action([ManufacturerController::class, 'index'], ["manufacturer" => $slug]);
}
# Works as expected
$exact_make = Manufacturer::where('slug', request("search"))->get();
if($exact_make->isNotEmpty()) {
echo "Exact manufacturer match!";
$results = $exact_make;
foreach ($results as $result) {
$slug = $result->slug;
}
return redirect()->action([ManufacturerController::class, 'index'], ["manufacturer" => $slug]);
}
# Doesn't work
$search_terms = SearchTerm::with("manufacturer")->where('term', "like", '%' . request("search") . '%')->get()->unique("manufacturers");
if($search_terms->isNotEmpty()) {
echo "Search term match!";
foreach ($search_terms as $search_term) {
$search_term = $search_term->manufacturer;
}
$results = collect($search_term);
}
# Works as expected
$search_make = Manufacturer::where('slug', 'like', '%' . request("search") . '%')->get();
if($search_make->isNotEmpty()) {
echo "Manufacturer match!";
$results = $search_make;
}
$results = isset($results) ? $results : collect();
}
return view("search", [
"manufacturer" => $manufacturer,
"results" => $results,
]);
}
}
查看文件:
@if($results)
<h1 class="my-5"> {{ $results->count() }} {{ $results->count() == 1 ? "result" : "results" }} found for <i>{{ request("search") }}</i></h1>
@foreach ($results as $result)
{{ $result->slug }}
@endforeach
@else
<p><h1>Sorry! We couldn't find any results for <i>"{{ request("search") }}"</i>.</h1></p>
@endif
在 foreach
循环之前触发条件时 dd($results)
的结果:
Illuminate\Support\Collection {#1406 ▼
#items: array:5 [▼
"id" => 15
"slug" => "ford"
"name" => "Ford"
"created_at" => "2022-01-28T19:53:28.000000Z"
"updated_at" => "2022-01-28T19:53:28.000000Z"
]
#escapeWhenCastingToString: false
}
触发 foreach
循环内部条件时 dd($result)
的结果(除了主键外,数组中什么也没有显示):
15
您不能通过构造函数将模型添加到集合中,它最终会从中提取属性,因为模型是 Arrayable
(它将调用 toArray
并获取attributes/appends/relationships 作为一个数组)。您可以在集合上调用 add
来添加模型。
$results = collect()->add($search_term);
或者您可以将数组传递给它期望的 collect
:
$results = collect([$search_term]);
附带说明一下,您正在进行大量迭代以仅从 Collection 中获取最后一个值以在所有这些条件下使用。您可以在集合上调用 last
以获取最后一个值,或者甚至将查询限制为 return 单个结果而不是整个结果集,因为您实际上没有使用任何结果集,除了最后一条记录。