20200926のPHPに関する記事は5件です。

PHP連想配列のキーとバリューを組み替える方法

DBから取ってきたデータをビューに渡す時に、中の要素でキーとバリューの組み合わせを作って新しい連想配列を作りたい場面があったのですが、色々調べてもどれもしっくりこなかったので、本記事を書いてみました。

例えば、下記のような都道府県と市区町村がセットになっているデータがあったとして、

$area_list = [
        ['prefecture' => '東京都', 'city' => '新宿'],
        ['prefecture' => '東京都', 'city' => '渋谷'],
        ['prefecture' => '東京都', 'city' => '原宿'],
        ['prefecture' => '大阪府', 'city' => '難波'],
        ['prefecture' => '大阪府', 'city' => '梅田'],
        ['prefecture' => '大阪府', 'city' => '京橋'],
        ['prefecture' => '愛知県', 'city' => '名古屋'],
        ['prefecture' => '愛知県', 'city' => '金山'],
        ['prefecture' => '愛知県', 'city' => '春日部']
    ];

これを下記のような、都道府県がキーで、市区町村がバリューの連想配列にしたいとします。

Array
(
    [東京都] => Array
        (
            [0] => 新宿
            [1] => 渋谷
            [2] => 原宿
        )

    [大阪府] => Array
        (
            [0] => 難波
            [1] => 梅田
            [2] => 京橋
        )

    [愛知県] => Array
        (
            [0] => 名古屋
            [1] => 金山
            [2] => 春日部
        )

)

色々PHPの配列操作について調べたり、if文書いたりしてみたんですが、試しに下記のコードを実行したところ、一発でうまくいきました。

$new_array = [];

foreach ($area_list as $area) {
    $new_array[$area['prefecture']][] = $area['city'];
}

$area_listのデータの順番が都道府県順に並んでいなくても、都道府県ごとのデータになります。

蓋を開けてみれば、とても簡単な話でした。
この半年ぐらいずっとプロジェクトでコード書いていて、だいぶ慣れてきたと思ったんですが、その分何か特別な関数が必要かと疑心暗鬼になってしまい、迷子になりかけてしまいました。

初心を忘れないようにします。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelのFactoryで連続した日付データの挿入


Laravelのseederやらfactoryについて勉強中、連続した日付データの挿入に苦戦したので備忘録




schedule_table

id title schedule_day
1 aaa 2020-09-27
2 bbb 2020-09-28
3 ccc 2020-09-29
4 ddd 2020-09-30
5 eee 2020-10-01

↑こんな感じで日付が連続したテストデータが欲しかった




実行するシーダーファイルを記述

DatabaseSeeder.php
class DatabaseSeeder extends Seeder
{
    public function run()
    {
        $this->call([
            UserSeeder::class,
            ScheduleSeeder::class
        ]);
    }
}



対象のカラムはシーダーファイルから値を指定するので空文字にしておく

ScheduleFactory.php
$factory->define(App\Models\Schedule::class, function (Faker $faker) {
    return [
        'title' => $faker->words,
         // seederファイルから上書きするので空にしておく
        'schedule_day' => '',
    ];
});



modify('+1day')でタイムスタンプを変更しつつ、その日付をfor文で一件ずつ挿入していく

ScheduleSeeder.php
class ScheduleSeeder extends Seeder
{
    public function run()
    {
        $scheduled_date = new DateTime();
        for ($i = 0; $i < 5; $i++)
        {
            factory(App\Models\Schedule::class, 1)
            // createに配列でカラム名、値をセットするとfactoryファイルの内容を上書きできる
            ->create([
                'schedule_day' => $scheduled_date->modify('+1day')->format('Y-m-d')
            ]);
        }
    }
}



この辺、あまり参考記事がないので難しい、、

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP Laravel 6 おすすめ映画投稿サイト作成過程 9:リレーション編

リレーションの定義

リレーション3パターン

1対1

一つのモデルが一つのモデルと関係を持つタイプです。

1対多

一つのモデルが多くのモデルを持つタイプです。

多対多

三つ以上のモデルが存在し、それぞれが関係を持つタイプです。

多対多で、タグをボタン選択式にして実装

今回のタグ付けには、多対多を使用します。
まず、recommendsテーブルとtagsテーブルを関連付けるためのrecommend_tagテーブルを作成します。

$ php artisan make:migration create_recommend_tag_table

次に、作成した create_recommend_tag_table を以下の内容に編集します。

recommend/database/migrations/2020_09_26_103413_create_recommend_tag_table.php
public function up()
    {
        Schema::create('recommend_tag', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('recomend_id');
            $table->unsignedBigInteger('tag_id');
        });
    }
recommend/app/Models/Recommend.php
class Recommend extends Model
{
    protected $fillable = [
      'title',
      'image_file_name',
      'image_title',
      'url',
      'description',
      'Impressions'
    ];

    //リレーション
    public function tags()
    {
    return $this->belongsToMany(tag::class);
    }
}
recommend/app/Models/Tag.php
class Recommend extends Model
{
class Tag extends Model
{
    protected $fillable = [
      'title',
    ];

    //リレーション
    public function recommend()
    {
    return $this->belongsToMany(Recommend::class);
    }
}

recommendと連帯した表示をさせるため、コントローラにtagモデルを設定します。

recommend/app/Http/Controllers/RecommendController.php
use App\Models\Recommend;
use App\Models\Tag;
// use Illuminate\Http\Request;
use App\Http\Requests\RecommendPostRequest;

recommendコントローラーにtagを渡します。

recommend/app/Http/Controllers/RecommendController.php
public function create()
    {
        $tags = Tag::all();
        return view('recommends.create', compact('tags'));
    }


public function edit(Recommend $recommend)
    {
      $tags = Tag::all();
      return view('recommends.edit', compact('recommend', 'tags'));
    }

recommendのeditとcreateにtagをforeachで組み込み

recommend/resources/views/recommends/create.blade.php
@foreach($tags as $tag)
  <th>
  <input type="checkbox" name="tag">{{$tag->title}}
  </th>
  @endforeach
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelとは+導入方法

今回はphpのフレームワークの中で最もポピュラーであるLaravelという物を紹介していきたいと思います。

フレームワークとは

そもそもフレームワークとはなんだろうと思われる方もいらっしゃると思いますので、まずフレームワークの説明をしていきたいと思います。

フレームワークとは概念的な意味で言うと「枠組み」と言う意味合いをもっています。あるいは、システム開発を楽に行えるようになるプログラムや雛形のことを意味します。このフレームワークを使う事により、開発時間の短縮化、複数人で開発を行う際にコードの統一化を図ることができ、効率的に開発を進めていく事ができます。
下記はphpのフレームワークと簡単な特徴を紹介します。

1.Laravel

世界で人気のフレームワーク
2020年現在、国内において主流のPHPフレームワークであり日本語のドキュメントも充実しています。

2.Cakephp 

日本では最も利用されてきたPHPフレームワーク
Ruby on Railsの概念を取り入れて開発されたPHPのフレームワークで、セキュリティ対策が充実しているので商用アプリケーションに最適です。

3.CodeIgniter

2006年にリリースされたPHPのフレームワークで、動的なWebサイトの開発に最適です。
必要に応じて随時機能追加していくような設計となっているので、軽量で高速動作するのが特徴です。

4.Symfony

2007年にリリースされたRuby on Railsの概念とMojaviの思想を取り入れたPHPのフレームワークで、大規模なWebサービスを開発するのに最適です。

5.FuelPHP

FuelPHPは2011年にリリースされた比較的新しいPHPのフレームワークで、「規約より設定」を重視して設計されているので高度なWebアプリケーションの開発に適しています。

他にもフレームワークの種類はいくつかありますので興味のある方は是非調べてみてください。
この中で今回は最もポピュラーなLaravelを紹介していきます。

Laravel

LaravelはMVCモデルに基づいてます。
MVCモデルとはM(Model),V(View),C(Contoroller),の頭文字をとったものです。
下記の流れで処理が実行されていきます。以下のような流れで処理が実行されていきます。①のリクエストの後にRoutingという物も存在します。それを介してContollerに処理を繋げていきます。
image.png

導入方法

まずMAMPのhtdocsに移動していきます。

$ cd /Applications/MAMP/htdocs/

ここではcomposerを使うと簡単にインストールできますので、composerを使ってインストールしていきます。composerの導入は省略します。

$ composer global require laravel/installer

こちらのコマンドでインストールできます。そして、次のコマンドでLavavelでblogという新しいプロジェクトを作成できます。

$ laravel new blog

また、ターミナルでComposerのcreate-projectコマンドを実行し、Laravelをインストールする方法もあります。

$ composer create-project --prefer-dist laravel/laravel blog

終わりに

今回はLaravelを導入するまでの流れを紹介しました。次回は実際にLaravelを使って、一連の流れを紹介していきたいと思います。

参考サイト

https://kredo.jp/media/php-framework/
https://futurizm.jp/articles/191
https://readouble.com/laravel/7.x/ja/installation.html
https://www.ritolab.com/entry/49

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPUnit assertStringContainsString アサーションについて

目的

  • PHPUnitのアサーションの1つであるassertStringContainsStringについてかんたんにまとめる

すみません

  • 本記事は筆者の備忘録的要素が強いためメモ的な簡易的な記事となる。
  • 内容が薄い場合は参考文献先などを参考に各自て補填していただければ幸いである。

assertStringContainsString

  • 検査対象の中に指定された文字列が含まれているかをチェックするアサーションである。
  • 具体例を下記に記載する。

    assertStringContainsString('A', 'B');
    
  • 上記のようにテストコードが記載された場合、指定された文字列がAで検査対象がBとなる。

  • もう少しざっくりとしたコードを日本語を交えて記載する。

    assertStringContainsString('検査対象に入っていることが期待されている指定された文字列', '検査対象の文字列や変数')
    
  • もう少し具体的な例を下記に記載する。

    • $arrayには連想配列が格納されており、キーと値は下記のようになっている。

      $array = [
          'id' => 1,
          'name' => 'Hoge Hoge',
      ]
      
    • $arrayに「Hoge Hoge」という文字列が格納されているかをassertStringContainsStringのアサーションを使ってテストする際は下記のようになる。

      assertStringContainsString('Hoge Hoge', $array);
      
    • 上記のテストコードを実行すると「テストOK」となる。

まとめ

  • assertStringContainsStringアサーションは「検査対象の中に指定された文字列が含まれるか」をチェックするものである。

参考文献

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む