Laravel Группировать результаты запроса и показывать их сгруппированные в форме :: выберите - PullRequest
0 голосов
/ 25 февраля 2020

Не могли бы вы помочь мне с следующей проблемой, которую я имею, я расскажу вам о том, что у меня есть:

У меня есть 3 модели с отношением Один-ко-многим:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Models\Province;

/**
 * Class Currency
 *
 * @property $id
 * @property $abbreviation
 * @property $description
 * @property $active
 * @property $created_at
 * @property $updated_at
 *
 * @package App
 * @mixin \Illuminate\Database\Eloquent\Builder
 */
class Country extends Model
{
    /**
     * Attributes that should be mass-assignable.
     *
     * @var array
     */
    protected $fillable = ['name','abbreviation','active'];

    public function provinces()
    {
        return $this->hasMany(Province::class);
    }
}

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Models\Country;
use App\Models\Entity;

/**
 * Class Province
 *
 * @property $id
 * @property $name
 * @property $active
 * @property $created_at
 * @property $updated_at
 *
 * @package App
 * @mixin \Illuminate\Database\Eloquent\Builder
 */
class Province extends Model
{
    /**
     * Attributes that should be mass-assignable.
     *
     * @var array
     */
    protected $fillable = ['name', 'country_id', 'active'];

    public function country()
    {
        return $this->belongsTo(Country::class);
    }
}
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Models\Province;

class Entity extends Model
{
    /**
     * Attributes that should be mass-assignable.
     *
     * @var array
     */
    protected $fillable = ['name', 'province_id', 'active'];

    public function province()
    {
        return $this->belongsTo(Province::class);
    }
}

Я хочу показать в представлении с Blade выбор с группированными параметрами, в этом случае:

-- Country 1
   -- Province 1
   -- Province 2
   -- Province 3
-- Country 2
   -- Province 1
   -- Province 2
   -- Province 3

Я передаю переменную $provinces в виде с Blade следующим образом :

    public function edit($id)
    {
        $entity = Entity::find($id);

        $provinces = Province::get(['id', 'name', 'country_id'])->groupBy(['country.name', 'name'])->toArray();

        return view('entity.edit', [
            'entity' => $entity,
            'provinces' => $provinces
        ]);
    }
<div class="form-group">
    {{ Form::label('Provinces') }}
    {!!Form::select('province_id', $provinces, $entity->province->id ?? null, ['class' => 'form-control'])!!}
</div>

но я не достигаю ожидаемого результата, я полагаю, что во время чтения второй параметр, переданный Form::select, должен иметь тип 2-мерного массива

Пожалуйста, если бы вы могли помочь мне пройти через красноречие, чтобы получить все провинции и сгруппировать их по странам, чтобы получить массив из двух измерений, как мне это нужно. Большое спасибо заранее

1 Ответ

0 голосов
/ 25 февраля 2020

Начните с Country вместо Province.

Попробуйте:

$countries = Country::with('provinces')->get()->transform(function($country) {
    return [$country->name => $country->provinces->pluck('name','id')];
});

Это должно вернуть структуру, подобную этой:

"Country 1" =>
     1 => "Province 1"
     2 => "Province 2"
     3 => "Province 3"

NB. Для этого может потребоваться небольшой рефакторинг, так как я пока не смог его запустить!

...