人気のPHP WEBアプリケーションフレームワークLaravelのTipsを記録していきます:タグ「DB」での検索

Laravelのモデル(Eloquent)の結果セット(Collection)に任意のカラムを追加する

● Laravelのモデルの結果セットに「任意のカラム」を追加する

Laravelのモデル(Eloquent)の結果セット(Collection)に任意のカラムを追加するには map() を使用します。

// コレクションのすべてのデータにurl = http://your.url/here を追加
$collection->map(function ($v) {
    $v['url'] = 'http://your.url/here';
    return $v;
});
// コレクションそれぞれに count=xxx (任意の値) を追加
$collection->map(function ($v) {
    $v['count'] = <計算ロジック>;
    return $v;
});

● Laravelのモデルの結果セットに書式を変える「Accessor /Mutator」を追加する

少し書式を変えたいときは Accessor /Mutator を使いましょう

モデルファイルに以下を記述

    /**
     * アクセサー : is_starred=1 の時に ☆ を表示する
     */
    public function getStarMarkAttribute()
    {
        if ($this->attributes['is_starred'] == 1){
            return '<div class="text-warning">★</div>';
        }
    }

呼び出し方

$model->star_mark
No.1384
12/10 11:35

edit

モデル
Eloquent
DB

Laravel でリレーションを設定し、リレーション先のテーブルを取得する

LaravelでEloquentを使ってリレーションを設定し、リレーション先のテーブルを取得する方法です。

● テーブル例

次のような2つのテーブルがあるとします
・「チーム」(teams)
・「ユーザー」(users)

このようにチームの中に複数のユーザーが所属するとします

 ─── マイチーム
     ├── 鈴木 一郎
     ├── 山田 太郎
     ├── 中村 二郎

● リレーションの設定

モデル /app/Team.php

public function users() // 複数形(users)にする
{
    // 「is_deleted = 0」のデータを「idの大きい順」で取得する
    return $this->hasMany('App\User')->where('is_deleted', 0)->orderBy('id', 'DESC');
}

(取得条件やソート順を指定することができます。)

モデル /app/User.php

public function team() // 単数形(team)にする
{
    return $this->belongsTo('App\Team');
}

● リレーションのデータの取得

・1. チーム一覧を所属するユーザー一覧とともに取得する

use App\Team;
$all_teams = Team::with('users')->get();
dd( $all_teams->toArray() );

(実は with() メソッドを指定しなくても、Bladeテンプレートの中で リレーションオブジェクトを呼び出そうとすると自動取得されます。 ただ、自動取得が100回あると100回SQLクエリが投げられるので非効率です。with()メソッドだと in句 で一撃で取得してきます。)

・2. ログイン中のユーザーデータを(チームIDに加えて)チーム名とともに取得する

方法1: with() を使ったやり方

$user = User::with('team')->find( Auth::user()->id );
dd( $user->toArray() );

実行されるSQL文

select * from `users`";
select * from `teams` where `teams`.`id` in (?); // ? は プレースホルダ

 

方法2: LEFT JOIN を使ったやり方

$user = User::leftJoin('teams','teams.id','=','users.team_id')->find( Auth::user()->id );
Mydump::dump( $user->toArray() );

実行されるSQL文

select * from `users` left join `teams` on `teams`.`id` = `users`.`team_id` where `users`.`id` = ? limit 1

・3. 全ユーザー一覧を(チームIDに加えて)チーム名とともに取得する

$all_users = DB::table('users')
                ->leftJoin('teams','teams.id','=','users.team_id')
                ->get();
Mydump::dump( $all_users );

その他リレーションの参考: https://laravel-news.com/eloquent-tips-tricks

No.1304
11/10 22:21

edit

DB
Eloquent
モデル

LaravelでDBのシーダーを使ってデフォルトのデータをセットする

マイグレーションをやり直した時に、DBデータも自動で登録できるようにシーダーを使ってデータを作成しておくと マイグレーションのやり直しがとても楽にできます。

● DBのシーダーファイルを作る

テーブル名「clients」の場合「ClientsSeeder」や「ClientsTableSeeder」といった名前をつけて作成します。

(例: clients テーブル用のシーダーファイルを作成する )

php artisan make:seeder ClientsSeeder

database/seeds/ClientsSeeder.php が作成されます )

● 作成されたDBのシーダーファイルを編集する

database/seeds/ClientsSeeder.php

<?php
use Illuminate\Database\Seeder;
class ClientsSeeder extends Seeder
{
    /**
     * Run the database seeds.
     * @return void
     */
    public function run()
    {
        DB::table("clients")->insert([
			'id'           => 1 ,
			'client_name'  => 'テスト商事' ,
			'tel_name'     => '012-345-6789' ,
			'fax_name'     => '012-345-6780',
        ]);
        DB::table("clients")->insert([
			'id'           => 2 ,
			'client_name'  => 'てすとの商事' ,
			'tel_name'     => '112-345-6789' ,
			'fax_name'     => '112-345-6780',
        ]);
    }
}

● 呼び出し元ファイル(DatabaseSeeder.php)に記述

database/seeds/DatabaseSeeder.php に作成したシーダーファイルを記述して呼び出します

<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     * @return void
     */
    public function run()
    {
        $this->call([
          ClientsSeeder::class ,		// 追加
        ]);
    }
}

● シーダーの実行

php artisan db:seed

● Class XXXXXSeeder does not exist エラーが出る場合

composer の autoload を再読み込みしてから実行するとうまく実行できます。

composer dump-autoload
php artisan db:seed
No.1303
10/23 14:43

edit

DB