LaravelでCakePHP 2.xのfind('list')のようなこと(インデックスつきの配列の取得)をやってみる | SEEDS Creators' Blog | 株式会社シーズ

LaravelでCakePHP 2.xのfind(‘list’)のようなこと(インデックスつきの配列の取得)をやってみる

こんにちは。CakePHP が好きな小國です。業務では Laravel を触っています。

突然ですが、CakePHP 2.x では Model::find(‘list’) というメソッドがあり、セレクトボックスなどで使うインデックス付きの配列を取得でき重宝していました。

https://book.cakephp.org/2/ja/models/retrieving-your-data.html#find-list

Laravel でも同じようなものがほしいなと思って見ていたのですが、デフォルトの機能にはないようでしたので、作成しましたという内容の記事になります。

やってみます

  • App\Traits\Selectable.php
<?php

namespace App\Traits;

use Illuminate\Database\Eloquent\Model;

trait Selectable
{
    public static function toSelectArray()
    {
        $instance = new static;
        $key = $instance->getKeyName();
        $value = $instance->getDisplayFieldName();

        /** @var Model $this */
        return static::all([$key, $value])
            ->pluck($value, $key)->toArray();
    }

    public function getDisplayFieldName()
    {
        if (property_exists($this, 'displayField')) {
            return $this->displayField;
        }
    }
}

使い方

Selectableトレイを使い、displayFieldプロパティで表示用のカラムを指定します。

<?php

namespace App;

use App\Traits;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    use Selectable;

    public $displayField = 'name';
}

toSelectArray() でインデックス付きの配列が取得できます。

User::toSelectArray();

その他

こちらにも同じソースを置いています。https://gist.github.com/tsmsogn/e6d8af0ad182b40ac512eaf1aa4d58fb