在控制器索引函数中检索相关字段会出错,但在显示函数中可以
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');
}
//...
}
我在 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');
}
//...
}