在控制器索引函数中检索相关字段会出错,但在显示函数中可以

retrieving related field in controller index function gives error but ok in show function

我在 Company table 中定义了关系(我在其中添加了复数):

protected $table = 'companies';

public function country() {
    return $this->belongsTo(Country::class, "country_id")->withDefault(['country' => 'unknown']);
}

我在 Country 模型中也做了同样的事情。

当我在控制器显示功能中使用以下代码时,它起作用了:

public function show (Company $company) {
    $company->country = $company->country()->pluck('country');

但是如果我在循环中的索引函数中使用相同的代码,我会收到错误消息“调用未定义的方法 stdClass::country()”:

public function index (Company $company) {
    if (request('tag')) {
        $companies = Tag::where('name',request('tag'))->firstOrFail()->companies;
        $companies->page_title = "Businesses matching tag '".request('tag')."'";
    } else {
        $companies = DB::table('companies')
           ->where([['is_active', '=', '1']])
           ->orderBy('company')
           ->get();
    }
    foreach($companies as $key => $thisCompany) {
        ...
        $thisCompany->country = $company->country()->pluck('country');
    }

我想这是因为 $company 是在循环中创建的,而不是像 show(Company $company) 那样通过函数传递的...但是我找不到解决这个问题的方法。 .所以帮助将不胜感激。

我在函数的参数中添加了模型,并通过 $thisCompany 更改了循环中 $company 变量的名称,以避免与 $company 模型混淆。

没有错误,但 $country->country 字段不包含国家名称,而是“Illuminate\Support\Collection {#443 …1}”

为什么这么复杂?请帮忙...

保罗,对不起,我想我在评论中没有很好地解释自己。

我所说的“如果将 DB::table('companies') 更改为 Company 会怎样?”的意思是停止使用 DB Query Builder 以使用 Eloquent Company 模型.

具体在这段代码中:

$companies = DB::table('companies')
    ->where([['is_active', '=', '1']])
    ->orderBy('company')
    ->get();

所以,它可能是:

$companies = Company::where([['is_active', '=', '1']])
    ->orderBy('company')
    ->get();

解释是,在第一种方式(使用DB Query Builder)中,查询将return一个通用对象的集合(PHP stdClass对象)对 Company 及其关系一无所知。

另一方面,如果您使用 Eloquent model Company, it will return a collection of Company objects, which do know about relationships,特别是您定义为 country 的关系。

然后,当您遍历集合时,您将能够访问每个 Company 对象的 country 关系:

foreach($companies as $key => $company) {
    //...
    $company->country = $company->country()->pluck('country');
}

最后,您的代码可能如下所示:

public function index () {
    if (request('tag')) {
        $companies = Tag::where('name',request('tag'))->firstOrFail()->companies;
        $companies->page_title = "Businesses matching tag '".request('tag')."'";
    } else {
        $companies = Company::where([['is_active', '=', '1']])
           ->orderBy('company')
           ->get();
    }
    foreach($companies as $key => $company) {
        //...
        $company->country = $company->country()->pluck('country');
    }
    //...
}