我正在寻找使用Laravel Eloquent优化我的代码的解决方案。
我的问题是我想有条件地添加属性,而这个属性基本上是一个转换的多对多关系。
目前我在控制器(简化版)中有这个:
<?php
namespace App\Http\Controller;
/**
* Class Category
*/
class Category extends Controller
{
/**
* @return Collection
*/
public function index()
{
return Category::withCount('countries')->get();
}
/**
* @param int $id
*
* @return Category
*/
public function show($id)
{
$result = Category::where('id', $id)
->with('countries')
->firstOrFail();
$result->countries_list = '';
return $result;
}
}
我的分类模型看起来像这样(简化):
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
/**
* Class Category
*/
class Category extends Model
{
/**
* The accessors to append to the model's array form.
*
* @var array
*/
protected $appends = [
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'countries',
];
/**
* @return string
*/
public function getCountriesCountAttribute()
{
return trans_choice('labels.countries', $this->original['countries_count']);
}
/**
* @return
*/
public function getCountriesListAttribute()
{
return $this->countries->pluck('alpha_2');
}
/**
* Get the related Countries.
*/
public function countries()
{
return $this->belongsToMany(
Country::class,
'category_country',
'category_id',
'country_id'
);
}
}
国家/地区模型只是具有ID,名称,Alpha2代码等的国家/地区列表。我无法使用受保护的$ appends添加countries_list,因为列表将始终包含在内。 我也无法更改我的国家/地区模型,因为它会在其他几种情况下使用。
我正在寻找的是一种优化控制器中代码的方法:
<?php
namespace App\Http\Controller;
/**
* @return Collection
*/
public function index()
{
return Category::withCount('countries')->get();
}
/**
* @param int $id
*
* @return Category
*/
public function show($id)
{
return Category::where('id', $id)
->withAttribute('countries_list') // An array of all country aplha 2 codes
->firstOrFail();
}
答案 0 :(得分:-1)
您可以在查询后访问countries_list
属性(不要将包含在您的查询中)。
public function show($id)
{
$category = Category::findOrFail($id);
$list = $category->countries_list; // this calls getCountriesListAttribute()
}