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 单个结果而不是整个结果集,因为您实际上没有使用任何结果集,除了最后一条记录。