在查询构建/代码优化上附加Eloquent属性/修改后的关系日期

时间:2017-11-12 14:40:59

标签: laravel eloquent laravel-5.5

我正在寻找使用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();
}

1 个答案:

答案 0 :(得分:-1)

您可以在查询后访问countries_list属性(不要将包含在您的查询中)。

public function show($id)
{
    $category = Category::findOrFail($id);

    $list = $category->countries_list; // this calls getCountriesListAttribute()
}