LaavelEloquent Collection을 확장해 보십시오.

7633 단어 PHPLaravel
Eloquent ORM을 통해 DB에서 값을 가져오면 Collection 객체가 반환됩니다.
얻은 데이터는 각양각색의 가공을 할 수 있어 매우 편리하다.
하지만 원하는 형태의 데이터로 도저히 변환할 수 없기 때문에 추가로 변환해 돌아오는 방법을 시도해 봤다.
이 확장은 서비스 제공자를 등록할 필요가 없기 때문에 매우 간단하다.
대상 버전(작업 확인 완료)은 5.1입니다.
DB는 Postgresql9입니다.4.4 사용했습니다.

추가 방법 클래스 준비


Illuminate\Database\Eloquent\Collection 을 계승할 클래스를 준비합니다.
추가 방법에 대해서는 잠시 후에 설명하겠습니다.
이런 느낌으로 준비해 봤어요.
app/KantaiCollection.php
<?php namespace App\KantaiCollection;

use Illuminate\Database\Eloquent\Collection;

class KantaiCollection extends Collection
{

}
솔직히 나 이거 하고 싶었어.추우신 분들은 브라우저를 제자리에 놓으세요!
...그러나 사실상 전혀 무관한 이슈는 아니어서 함정 사용 여부는 불분명하지만, DMM이 운영하는 게임 중에는 라벨5를 도입하는 것도 있다.
DMM 게임의 로그 해석 ~ 로그 수집 및 해석 개요 ~
http://labotech.dmm.com/entry/2015/08/20/184051

추가 방법에 대한 설명


비록 약간 오프라인 상태이지만, 나는 그래도 돌아가서 설명해야겠다.
내가 원하는 데이터 형식은 지정한 열을 키로 하는 연상 배열이다.
순환 처리 시 isset에서 존재를 확인하고 성능을 높일 수 있기 때문이다.
또 연상 배열의 성질을 이용해 SQL에서 디스틴act를 사용하지 않아도 중복을 생략한 일람표를 얻을 수 있다.
(나는 아직 어떤 공연이 좋은지 조사하지 못했다)
그래서 이렇게 실시해 보았다.
app/KantaiCollection.php
<?php namespace App\KantaiCollection;

use Illuminate\Database\Eloquent\Collection;

class KantaiCollection extends Collection
{
    /**
     * 指定したカラムをキーにHash化 
     * 
     * @param  string $column
     * @return array 
     */
    public function toHash($column)
    {
        $result = [];

        foreach ($this->items as $item)
        {
            $result[$item[$column]] = $item;
        } 

        return $result;
    }
}
간단한 설명 처리 후
items에는 가져올 때의 그룹과 대상이 포함되어 있습니다.
따라서 이 순환을 한 다음 지정한 열을 키로 다시 배열합니다.

Eloquent Model의 new Collection을 다시 작성합니다.


Eloquent Model을 준비하고 new Collection()을 다시 쓰는 방법입니다.
app/Kantai.php
<?php namespace App\Kantai;

use Illuminate\Database\Eloquent\Model;

use App\KantaiCollection;

class Kantai extends Model
{
    /**
     * コレクションの拡張
     *
     * @param  array  $models
     * @return \App\KantaiCollection
     */
    public function newCollection(array $models = [])
    {
        return new KantaiCollection($models);
    }
}
이렇게 되면 아까의 방법을 사용할 수 있을 거야!
참고로 문서에도 기재되어 있어서 많은 사람들이 알고 있을 것이다
artisan 명령을 사용하여 모형을 제작할 때 - m 옵션을 추가하면 이동도 동시에 생성되어 매우 편리합니다.
(seeder를 같이 만들 수 있는 옵션이 있으면 더 편해요)

데이터 준비해서 확인할게요.


Kantais 테이블의 데이터를 준비합니다.
함종과 이름의 간단한 데이터일 뿐, 그 안에는 이런 느낌이 든다.
Kantais
 id |   type   | name |     created_at      |     updated_at      
----+----------+------+---------------------+---------------------
  1 | 駆逐艦  | 吹雪 | 2015-12-24 00:00:00 | 2015-12-24 00:00:00
  2 | 駆逐艦  | 睦月 | 2015-12-24 00:00:00 | 2015-12-24 00:00:00
  3 | 軽巡洋艦 | 川内 | 2015-12-24 00:00:00 | 2015-12-24 00:00:00
  4 | 軽巡洋艦 | 神通 | 2015-12-24 00:00:00 | 2015-12-24 00:00:00
  5 | 重巡洋艦 | 愛宕 | 2015-12-24 00:00:00 | 2015-12-24 00:00:00
  6 | 重巡洋艦 | 利根 | 2015-12-24 00:00:00 | 2015-12-24 00:00:00
  7 | 戦艦   | 長門 | 2015-12-24 00:00:00 | 2015-12-24 00:00:00
  8 | 戦艦   | 金剛 | 2015-12-24 00:00:00 | 2015-12-24 00:00:00
  9 | 空母   | 赤城 | 2015-12-24 00:00:00 | 2015-12-24 00:00:00
 10 | 空母   | 加賀 | 2015-12-24 00:00:00 | 2015-12-24 00:00:00

그러면 모든 기록을 얻고name을 키로 하는 연상 배열을 얻습니다.
방법의 사용법은 이런 느낌이다.
app/Http/Controllers/KanColleController.php
<?php

namespace App\Http\Controllers\KanColle;

use App\Http\Controllers\Controller;

class KanColleController extends Controller
{
    public function index()
    {
        $kantai = app('App\Kantai');
        dd($kantai->all()->toHash('name'));
    }
}
실행하다

문제없이 얻었다.
그나저나 아까 방법은 all()밖에 없었는데 소장으로 반납하면...

물론 콜렉션 대상의 이름은'KantaiCollection'이다.
그래서 이번이 두 번째야. 그냥 이거 하고 싶을 뿐이야
이상, 교제해 주셔서 감사합니다.

총결산

  • Illuminate\Database\Eloquent\Collection 을 계승할 학급
  • 준비
  • 추가할 처리를 설명합니다
  • Eloquent Model을 다시 쓰는 new Collection ()
  • 지적하고 더 좋은 방법이 있는 사람은 반드시 메시지를 남겨주세요.

    좋은 웹페이지 즐겨찾기