hero_picture

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

2019/12/20

こんにちは。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
1<?php
2
3namespace App\Traits;
4
5use Illuminate\Database\Eloquent\Model;
6
7trait Selectable
8{
9    public static function toSelectArray()
10    {
11        $instance = new static;
12        $key = $instance->getKeyName();
13        $value = $instance->getDisplayFieldName();
14
15        /** @var Model $this */
16        return static::all([$key, $value])
17            ->pluck($value, $key)->toArray();
18    }
19
20    public function getDisplayFieldName()
21    {
22        if (property_exists($this, 'displayField')) {
23            return $this->displayField;
24        }
25    }
26}

使い方

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

1<?php
2
3namespace App;
4
5use App\Traits;
6use Illuminate\Database\Eloquent\Model;
7
8class User extends Model
9{
10    use Selectable;
11
12    public $displayField = 'name';
13}

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

1User::toSelectArray();

その他

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