商売力開発ブログ

非エンジニアがWebサービスの開発、運営によって商売力をつける記録、その他の雑記

【スポンサーリンク】

Google API を利用して、PHPで日本とアメリカの祝日を取得する

今回はGoogleのカレンダーAPIを利用して、PHPで日本とアメリカの祝日を取得する方法を紹介します。

GoogleAPIを利用する

GoogleのカレンダーAPIを利用するには、Googleのアカウントを作成して、Google Developers Console でAPIを利用できるように設定する必要があります。この辺りの手順は以下を参考にして下さい。

Google Calendar API を使って祝日を取る PHP編 - Qiita

ここにあるPHPのAPIのコードも参考にしましょう。

    $api_key = '取得したAPIキー';
    $holidays_id = 'japanese__ja@holiday.calendar.google.com';
    $holidays_url = sprintf(
        'https://www.googleapis.com/calendar/v3/calendars/%s/events?'.
        'key=%s&timeMin=%s&timeMax=%s&maxResults=%d&orderBy=startTime&singleEvents=true',
        $holidays_id,
        $api_key,
        $start_date,
        $end_date,
        30  
    );

    if( $results = file_get_contents($holidays_url, true))
    {
        $results = json_decode($results);
        $holidays = array();
        foreach($results->items as $item)
        {
            $date = strtotime((string) $item->start->date);
            $title = (string) $item->summary;
            $holidays[date('Y-m-d', $date)] = $title;   
        }
        ksort($holidays);   
    }

カレンダーを指定して日本とアメリカの祝日を取得する

「$holidays_url」となっている部分で取得対象を指定することになります。

    $holidays_url = sprintf(
        'https://www.googleapis.com/calendar/v3/calendars/%s/events?'.
        'key=%s&timeMin=%s&timeMax=%s&maxResults=%d&orderBy=startTime&singleEvents=true',
        $holidays_id, //取得元のカレンダーID
        $api_key, //取得したAPIキー
        $start_date, //取得開始日付
        $end_date, //取得終了日付
        30  //最大取得日数
    );

取得する開始日付と終了日付については、いったんは今年1年間となるように設定してみます。

    $year = date(Y);
    $start_date = date($year."-01-01\T00:00:00\Z"); //取得開始日付
    $end_date  = date($year."-12-31\T00:00:00\Z"); //取得終了日付

「$holidays_id」に設定するカレンダーによって取得される祝日が変わってきます。「japanese__ja@holiday.calendar.google.com」を指定すると以下のような日付データが取得できました。これは日本の祝日になっています。

No 日付 名称
1 2018/01/01 元日
2 2018/01/08 成人の日
3 2018/02/11 建国記念の日
4 2018/02/12 建国記念の日 振替休日
5 2018/03/21 春分の日
6 2018/04/29 昭和の日
7 2018/04/30 昭和の日 振替休日
8 2018/05/03 憲法記念日
9 2018/05/04 みどりの日
10 2018/05/05 こどもの日
11 2018/07/16 海の日
12 2018/08/11 山の日
13 2018/09/17 敬老の日
14 2018/09/23 秋分の日
15 2018/09/24 秋分の日 振替休日
16 2018/10/08 体育の日
17 2018/11/03 文化の日
18 2018/11/23 勤労感謝の日
19 2018/12/23 天皇誕生日
20 2018/12/24 天皇誕生日 振替休日

続いて「japanese__en@holiday.calendar.google.com」を指定すると以下のような日付データが取得できました。これは英語での日本の祝日になっています。

No 日付 名称
1 2018/01/01 New Year's Day
2 2018/01/08 Coming of Age Day
3 2018/02/11 National Foundation Day
4 2018/02/12 National Foundation Day observed
5 2018/03/21 Spring Equinox
6 2018/04/29 Shōwa Day
7 2018/04/30 Shōwa Day observed
8 2018/05/03 Constitution Memorial Day
9 2018/05/04 Greenery Day
10 2018/05/05 Children's Day
11 2018/07/16 Sea Day
12 2018/08/11 Mountain Day
13 2018/09/17 Respect for the Aged Day
14 2018/09/23 Autumn Equinox
15 2018/09/24 Autumn Equinox observed
16 2018/10/08 Sports Day
17 2018/11/03 Culture Day
18 2018/11/23 Labor Thanksgiving Day
19 2018/12/23 Emperor's Birthday
20 2018/12/24 Emperor's Birthday observed

「usa__ja@holiday.calendar.google.com」を指定すると以下のような日付データが取得できました。これはアメリカの祝日になっていますが、一部祝日でない日付も含まれています。また日本語ではなく英語でした。

No 日付 名称
1 2018/01/01 New Year's Day
2 2018/01/15 Martin Luther King Jr. Day
3 2018/02/14 Valentine's Day
4 2018/02/19 Presidents' Day (regional holiday)
5 2018/03/11 Daylight Saving Time starts
6 2018/03/17 St. Patrick's Day
7 2018/04/01 Easter Sunday
8 2018/04/17 Tax Day
9 2018/05/05 Cinco de Mayo
10 2018/05/13 Mother's Day
11 2018/05/28 Memorial Day
12 2018/06/17 Father's Day
13 2018/07/04 Independence Day
14 2018/09/03 Labor Day
15 2018/10/08 Columbus Day (regional holiday)
16 2018/10/31 Halloween
17 2018/11/04 Daylight Saving Time ends
18 2018/11/11 Veterans Day
19 2018/11/12 Veterans Day observed
20 2018/11/22 Thanksgiving Day
21 2018/11/23 Black Friday
22 2018/12/24 Christmas Eve
23 2018/12/25 Christmas Day

Googleカレンダーでアメリカの祝日を選択すると上記と同じものが取得されるので、APIでもこのような英語での日付データとなります。これは「usa__en@holiday.calendar.google.com」を指定した場合も同様のデータとなります。アメリカの祝日に関してはAPIで取得したままだと、余計な日付が含まれてしまうので少し工夫をする必要がありそうです。またアメリカ以外の外国を選択した場合も、同様の状態がありえそうです。

まとめ

今回はGoogleのカレンダーAPIを利用して、PHPで日本とアメリカの祝日を取得する方法を紹介しました。

以上
【関連するリンク】
www.prj-alpha.biz

メール検証でACMの証明書の更新を行う

「Action Required - Your certificate renewal」という件名のメールがAWSから来ていました。ここではACMのメール検証での証明書の更新方法を紹介します。

ACMの証明書の更新

AWSのACMで証明書を発行していたのですが、メール検証で確認を行っていた場合、期限が近付くと「Action Required - Your certificate renewal」というタイトルのメールが送付されてきました。
この本文では、以下のメールアドレス宛に証明書の更新用のメールを送付したとありました。
postmaster@"DomainName", webmaster@"DomainName", administrator@"DomainName", admin@"DomainName", hostmaster@"DomainName"
確認してみると「Certificate renewal for "Domain Name" requires approval」というメールが来ていましたので、対応して証明書の更新を行います。

ちなみにそれ以前に「Impact of Changes to WHOIS on AWS Certificate Manager (ACM) Email Validation 」というタイトルのメールが来ていて、メール検証ではなくドメイン検証にするように促されてましたが、特に対応していなかったのでメール検証での手順が自動で案内されたようです。

手順

まずはACMの画面で状態を確認します。詳細までみると検証状態が「検証保留中」となっていることが確認できます。メール検証を行い、こちらを更新していく作業を行っていきます。

「Certificate renewal for "Domain Name" requires approval」のタイトルのメールから、リンクをクリックします。

リンクから表示された画面の「I Approve」のボタンを押します。

「Success!」と表示される画面になれば成功です。

ACMの画面で状態を確認すると、検証状態が「成功」となっています。ただ詳細の部分は「検証保留中」のままになっています。

しばらくすると詳細の内容も更新されます。リクエスト日、発効日が更新されるとともに更新ステータスが「成功」となっているのを確認できます。

以上でACMのメール検証での証明書の更新作業は完了です。

まとめ

今回はメール検証でのACMの証明書の更新方法の紹介でした。

以上

【提供サービス】プロジェクト管理、ガントチャートのProject-Alpha情報

※Project-Alphaは2019年12月をもって、サービスの提供を終了します。

ガントチャートを作成できるプロジェクト管理ツールProject-Alphaの情報になります。

プロジェクト管理ツールのProject-Alpha

サービス用のホームページです。こちらからアカウントを作成することができます。
home.prj-alpha.biz
新規にアカウントを作成した場合、以下を参考にして下さい。
www.prj-alpha.biz
ガントチャートの機能を中心にしたサービスの説明になります。
www.prj-alpha.biz

「SHOE DOG」と「ナイキを育てた男たち」

今回はナイキの創業者フィル・ナイトが創業前から上場までを描いた自叙伝、SHOE DOGを紹介します。この本の発売後にBSで特集された番組「ナイキを育てた男たち~“SHOE DOG”とニッポン~」についても紹介します。

ナイキの創業の物語

大きめに本屋に行くと黒のカバーに金の文字でSHOE DOGと刻まれた本が並んでいるのを見た人も多いかもしれません。ナイキの創業者であるフィル・ナイトによる自叙伝で、500ページを超えるボリュームなのですが40万部を超えるヒットになっているそうです。

SHOE DOG(シュードッグ)

SHOE DOG(シュードッグ)

 

 出版元の東洋経済新報社では特集ページまで作る熱の入れようです。

store.toyokeizai.net

フィル・ナイトの曖昧な記憶を元にしていたり、誇張した部分も多々含まれると思いますが、創業前後から上場までの悪戦苦闘ぶりが赤裸々に語られていて、その語り口も相まって非常に面白い作品に仕上がっています。
オニツカの販売代理店として始まったという話は聞いたことがあったのですが、ナイキと日本の関わりが予想以上に深いことを知ることができます。この辺りはBSの特集番組がわかりやすくなっています。以下はその取材担当記者による紹介です。

www3.nhk.or.jp

www.msn.com

番組内では、当時のオニツカの開発担当がナイキ(当時はブルーリボンという社名)側からの提案を受けて開発したコルテッツの話をしたり、本書の中では日商岩井のスメラギ、イトーとして登場しているお二人が取材に応じています。
ナイキ側ではナイトだけでなく、あの「手紙魔」ジョンソンや車いすのウッデルも取材に応じてくれています。

この取材の中で特に印象深いのはアイスマン・イトーとフィルナイトが呼んでいた伊藤忠幸氏のエピソードです。本書の中の一つのクライマックスは口座を凍結されピンチに陥ったところを「日商が返済します」といってイトーがフィル・ナイトを、いやナイキを救ったところでしょう。この本の中でスメラギが独断で社内規定を破ってインボイスの発行を遅らせていたことが書かれていますが、イトーこと伊藤忠幸氏もこの返済エピソードの際に社内規定を破っていたことが番組内で語られます。
「日商が返済します」といった金額は約1億9千万円でした。これは日商岩井の中では社長決裁が必要な金額なのですが、伊藤忠幸氏は独断で決済したために、これが問題となりました。結果、伊藤忠幸氏はクビを通告されます。「権限規定なんか、無視してやっちゃたんですけども」とたんたんとした口調で語る伊藤忠幸氏、当時30代前半の年齢にして彼も人生をかけていたのです。その後、彼に気をかけた取締役の尽力でクビは撤回され日商岩井に残ることができたとのことです。

シュードッグな人々

フィル・ナイトは地元のオレゴン大学で陸上チームに所属、卒業後に陸軍での1年間の勤務を経て、スタンフォード大学大学院にでMBA取得しています。その後助言を受けて公認会計士の資格を取得し、会社を立ち上げながら、プライスウォーターハウスで働いたり、大学で会計学を教えることもありました。
本書を読んでいてわかるのは相当な読書家であること。特に各国の歴史・宗教・文化について詳しい上に、実際に世界中を見て回っているのも知識の深さを感じさせます。交渉する相手の国や文化を勉強する描写も良く出てきます。読書に関しては以下のようにあり、極限でのリーダーシップで自身がどうするべきかをよく考えてたことが伺えます。

私は大将、侍、将軍などについてできる限りの本を読んだが、中でも夢中だったのは私にとっての英雄3人、チャーチル、ケネディ、トルストイの伝記だった。暴力はまったく好まないが、極限状況でのリーダーシップについては興味があった。戦争は究極の極限状況だが、ビジネスもある意味戦争だ。ビジネスは銃弾のない戦争だと誰かが言っていたが、私も同感だ。
(1966: P128)

このように基礎的な学力、経営学・会計学や歴史などの知識、実行に移す行動力、自分たちを負け犬だという謙虚さ、これらだけでも並々ならぬモノがありますが、これに加え靴に対して強烈な情熱を持っています。タイトルでもあるシュードッグとは本書の中で以下のように言っています。

シュードッグとは靴の製造、販売、購入、デザインなどすべてに身を捧げる人間のことだ。靴の商売に長く関わり懸命に身を捧げ、靴以外のことは何も考えず何も話さない。そんな人間同士が、互いにそう呼び合っている。
(1971: P265)

熱中の領域を超え、病的とも言えるほど靴のことばかり考えてる人たちです。
フィル・ナイトはもちろんですが、このような人たちが多く登場します。中でも共同経営者となるバウワーマンと従業員第1号となるジョンソンは印象的です。

バウワーマンはオレゴン大学の陸上部の伝説的コーチで、フィル・ナイトも指導を受けた人物です。ナイキの創業前から独自にシューズの改良などを行うほど靴に情熱を注ぐ人物で、ナイキでもいくつかの靴ブランドの発明を行っている。初期にはオニツカの靴を分解し、アメリカ人に合うためにはどうすれば良いか徹底的に研究しオニツカに提案してコルテッツが誕生しています。
バウワーマンがエアソールの開発を聞いて駄目だねと言ってたことに対するフィル・ナイトの感想がシュードッグならではです。

私がエアソールを開発中だとうっかり漏らすと彼の様子が変わった。空気を注入したルディの発明のことをバウワーマンに話すと、彼はあざ笑ったのだ。「ぷっ。エアシューズだって。そんなものうまくいくわけがないだろ、バック」
彼の言葉から少し感じ取れたのは、嫉妬だろうか?
私はいい兆候だと思った。彼の中で競争心が再び芽生えてきたのだから。
(1977: P440)

バウワーマンに靴に対する情熱が戻ってきた様子を喜んでいます。1977年はバウワーマンは60代の後半に差し掛かってます。その少し前には衰えた描写もあります。しかし引退するよりも、靴に関わり続ける方がシュードッグな人々にとっては重要なのです。

そしてもう一人のジョンソンに関してはエピソードが事欠きません。ジョンソンも大学時代は陸上の中距離走者で、フィル・ナイトの誘いに乗り販売員となり、その後フルタイムの従業員第1号となります。自身でも靴を改良したり、販売店を任されますが、突然東海岸への理不尽な異動にあったりしますがめげません。面白いのは手紙に関するエピソードです。手紙魔とまで言われるほど手紙を出しまくっていたようで、最後に必ず励ましに言葉を求めるのですが、それをフィル・ナイトは無視し続けたそうです。更にはこんな記述があります。

いっそアパートを完全に引き払って、オフィスに移った方がいいのではという案が頭をよぎった。何せ基本的にそこで寝泊まりしているも同然で、プライス・ウォーターハウスとブルーリボンを交互に行き来する毎日だ。シャワーはジムで浴びればいい。
だがオフィスで暮らすなど、まともな人間のすることではないと自分に言い聞かせた。
そしてジョンソンから、オフィスで寝泊まりしているという手紙を受け取った。
(1967: P166)

経営層に励ましを求めても無視され続けるも、自分の仕事を今まで以上に邁進し続ける従業員、仕舞いにはオフィスに泊まり込む生活を送ってしまう。こんな人に出会ったことはありません。ジョンソンも靴に関わる仕事ができることが幸せだと考えていたのでしょう。

採用について

ジョンソンの後に続く2人目の従業員を探すところに以下のような記述があります。

私は、東海岸を任せられる人を雇うことにした。もちろん元長距離ランナーだ。
(1967: P148)

 「もちろん」というほど、ランナーであることが重要な要素であると考えていたようです(他の伝手がなかっただけかもしれませんが)。この初期の段階では、優秀な営業マンよりも靴(=自分たちの扱う製品・サービス)に対する情熱を持っている人が適任だし必要だと考えてたのでしょう。

それが10年経過して、色々な人を採用していく中で以下のような記述があります。

別に私が会計士や弁護士を偏愛しているわけではない。才能のある人間をどこで発掘すればいいのかわからないだけだ。
(中略)
頭の切れる人間を雇うことが先決であり、少なくとも会計士や弁護士なら難しい課題に対処できるだろうし、ここぞという試験にも受かるだろう。
これまで雇ったほとんどの者が基本的な能力を示してくれた。
会計士を雇うのは、計算ができるからだ。弁護士を雇うのは話が達者だからだ。だが、マーケティングの専門家や製品の開発者を雇ったところで、何が期待できるだろう。何もない。彼らに何ができるのか、できることがあるのかすら予想できない。ではそこらのビジネススクールの卒業生はどうか。誰も好き好んで靴を売ろうとは思わないだろう。しかもみんな経験はゼロだから、雇う側は面接での感触に賭けてサイコロを振るしかない。一か八かでサイコロを振っていられる余裕など、こっちにはないのだ。
(1978: P463~464)

靴に対して情熱があるかわからない人を雇ってきた中で、フィル・ナイトが到達した考えが会計士や弁護士なら戦力としてまだ計算しやすいということでしょう。マーケティングの専門家なども靴に対して情熱があるかわからない人の場合は、一か八かの賭けとなるというのが、シュードッグな人々の判断なのでしょう。

その他

 人が1日に歩く歩数は平均7500歩で、一生のうちでは2億7400万歩となり、これは世界一周の距離に相当する。シュードッグはそうした世界一周の旅に関わりたいのだろう。
 (1971: P266)

会計士でもあったフィル・ナイトはこうした数字で考えることも意識していたのではないかと思われます。例えば平均より多く歩く人たちはどんな人たちか、それはどんな理由で多くなっていて何歩くらい多いのかとか、2億7400万歩のうちどれだけナイキは貢献できるか、履いてもらう歩数を増やすにはどうしたら良いかといったものです。
これは現在でも同じで単純に靴の売上高だけを考えている人には出てこない発想でしょう。

貴重な教訓を得た。1足のシューズに12もの新機軸を取り込んではいけない。デザインチームに対してはもちろん、シューズにも多くを求め過ぎたらしい。私たちは「製図版に立ち返ろう」を合言葉に、ワッフルメーカーを何個もダメにしたバウワーマンのことを振り返った。
(1978: P470

靴というある程度の型が決まっている製品に関して、新たな機能を多く入れ過ぎたことを失敗だったと振り返っています。多くの新機能を取り込むことに注力し過ぎることで、どこかに無理や見落としが発生したのかもしれません。これは靴以外の製品やサービスならどうでしょうか。自分たちの行う事業で当てはめて考察してみるのも良いかもしれません。

問題はどうやって中国に進出するかではない。すでに一部の会社が進出を予定しており、そうなれば他社も続くだろう。問題はどうやって最初に乗り込むかだ。最初に進出すれば数十年は有利に立てる。そうすれば中国の製造部門だけでなく、中国市場や中国の政治指導者との関係も有利に運ぶことができ、大きな成功を見込める。中国についてミーティングを重ねた最初の頃、私たちは常にこう言っていた。あの国には10億人の足があると。
(1979: P484

これはこちらで紹介したようなマーケティング22の法則の一番手の法則に近い考え方です。中国という10億人の足がある巨大市場で、一番に進出することがどれだけ有利になるか、重要であるかを意識していたことが伺えます。

ジョンソンは言う。「つまり、この新製品のナイキはまったく未完成で、はっきり言えば、そこまで良い代物じゃないのに、君たちは買おうとしている。何がそんにいいんだ?」
相手は笑った。「君たちブルーリボンとは何年ものつきあいだから、君たちが正直なのはわかってる。他の連中はデタラメだけど、君たちはいつもズバリ本当のことを言ってくれるから、この新製品、ナイキっていうんだっけ、これが当たると言えば信じるさ」
ジョンソンはブースに戻って頭をかいた。「本当のことを言うべきなんだな」
(1972: P288

これはこちらで紹介したようなマーケティング22の法則の正直の法則に近い考え方です。この当時のナイキにはお客にとってポジティブな要素はあまりないのかもしれませんが、正直なことが評価されています。このあたりは靴に対して嘘をつけないそれまでのシュードッグな人々の姿勢が大きな信頼を得ることになったのでしょう。

まとめ

今回は「SHOE DOG」と「ナイキを育てた男たち」の紹介でした。

以上

【更新情報】ガントチャートの休日設定が可能に

※Project-Alphaは2019年12月をもって、サービスの提供を終了します。

今回は我々が開発しているプロジェクト管理ツールProject-Alpha(プロジェクトアルファ)を更新したので内容を説明します。

更新情報

更新内容

これまでガントチャートでは、1日単位で表示した場合に土日が自動でグレーアウトするのみでした。今回の更新により、グレーアウトする曜日を設定することができるようになります。更に祝日など特定の日にちを設定することができるようになります。これらはプロジェクト毎に管理されます。

更新画面など

プロジェクト設定画面のコンテンツ設定を表示すると、休日に関する設定メニューが表示されます。

曜日に関する設定画面はこちらになります。休日として設定したい曜日について設定することが可能です。

祝日など日付の休日設定の画面はこちらになります。以下は休日日付が何も設定されていない場合の状態になります。

国別の休日の参照

休日設定の参考にできるように、国別の祝日の内容を参照できるようにしています。ただし表示するのは、今年・去年・来年の3年分となります。未来の祝日は変更される可能性があるためで、翌年になると参照できる年が変わっていくようになります。
参照できる国は日本とアメリカとしています。以下では一覧から日本をクリックして参照した場合の表示になります。

例えば、日本の休日設定からコピペして、プロジェクトの休日設定をすることができます。以下は2018年の休日を設定した状態です。

この状態でガントチャートのコンテンツを表示して、日付単位を「1」としている場合、設定した曜日と休日がグレーアウトされます。例えば以下では土日と2018/07/16の海の日がグレーアウトされます。

Excel出力した場合にも対応しています。入力画面と同様に日付単位を「1」としている場合、設定した曜日と休日がグレーアウトされます。

プロジェクト作成時に選択可能

休日設定はプロジェクトを作成時に選択することで初期設定として設定されます。

ユーザ固有の休日設定も可能

休日設定は国別の祝日を参照できますが、祝日でない年末年始休暇などの設定が必要な場合があります。このようなときに利用できる独自の休日設定を行うことができるようになっています。PMのメニューから休日設定を選択すると基本設定と休日設定を行うことができます。基本設定の公開中を「はい」にすることで、プロジェクトの作成やプロジェクトの休日参照で表示されることになります。

固有の休日設定画面は以下のようになります。例えば以下では祝日にはない年末年始休暇として2017/01/03を追加している状態となります。

また公開中としていることで、プロジェクトの作成やプロジェクトの休日参照で固有の休日設定が表示され選択することができるようになります。

まとめ

今回は更新情報の内容の説明でした。

以上

【関連するリンク】 

www.prj-alpha.biz

www.prj-alpha.biz

home.prj-alpha.biz

はてなブログが独自ドメインでもHTTPS化できるようになってたので手順を確認しておく

はてなブログが独自ドメインでもHTTPS化できるようになってました。

staff.hatenablog.com

手順を確認しておきましょう。

HTTPS化の対応手順

上記のリンクに記載されている手順は以下の通り

  1. ダッシュボードから設定画面から詳細設定へいき、HTTPS化の設定変更を行う。こちらは1回行うと元に戻すことはできないとのこと・・・
  2. 混在コンテンツ(Mixed Content)の対応を行う。ただしmetaタグの設定での対応部分はEdgeなどのブラウザでは未対応。

記事内に張った自身のブログのリンクとかも、HTTPSに変更する必要がありますね。

後はツール関連ですが、対応が必要なのがグーグルの Search Console のアドレス変更の対応です。独自ドメインで運用しているような人ならば、使用割合は高いでしょう。

www.prj-alpha.biz

HTTPからHTTPSに301リダイレクトされる必要があるのですが、そこは自動でやってくれそうなので問題なさそうです。

とりあえず、はてなブログの設定変更を行っているユーザは結構いるみたいです。我々も早めに対応する予定です。

以上

【関連するリンク】

www.prj-alpha.biz

 

Laravelのマイグレーション機能の活用⑤ 複数テーブルに同じカラムを追加する

今回はPHPフレームワークの一つのLaravelの中から、データベースのマイグレーションの機能の利用に当たって、我々の活用方法を紹介します。
今回利用するDBはMySQLですが、一部については他のDBでもほぼ同様に対応できます。
またマイグレーションに関連する内容は以下を参照して下さい。

Laravelのデータベースのマイグレーション機能 順番を強引に入れ替えることも可能 - 商売力開発ブログ
Laravelのマイグレーション機能の活用① メンバ変数を追加した上でテーブルのコメント追加も簡単に設定する方法 - 商売力開発ブログ
Laravelのマイグレーション機能の活用② 1つのファイルで複数のテーブル管理も可能 - 商売力開発ブログ
Laravelのマイグレーション機能の活用③ カラム定義の管理を楽にする方法 - 商売力開発ブログ
Laravelのマイグレーション機能の活用④ カラム定義のメソッド設定例 - 商売力開発ブログ

カラム共通設定用のメソッドを使用してのカラムの追加

前回までの記事で説明したように、カラム名を指定することで定義を設定できるようなLaravelのファサードのメソッドを今回も利用します。

MigrationFunc::columnDef($table,'column_name');

このMigrationFuncファサードのメソッドの引数は以下のようなもので、nullableやデフォルト値の設定もできるものです。詳しくはこちらを参照して下さい。

public function columnDef(Blueprint $table,$column_name,$nullable_flg=false,$default=null)

今回は複数のテーブルに対して、同じカラムを追加する場合の対応を行います。ほぼ同じ構成のテーブルに対して行うイメージとなります。
まずはマイグレーションファイルに、テーブル名と追加するカラム名を設定します。今回はMySQLのみだけで利用できるafterのカラムも設定しています。

    public $tbl_array=array('tbl_name_1','tbl_name_2','tbl_name_3');
    public $add_col_name='add_colomn';
    public $aft_col_name='after_column';//MySQLのみ

これらのプロパティ(メンバ変数)を利用してupメソッドとdownメソッドを設定していきます。
またテーブルへの変更の場合、Schema::tableを使用して設定します。

Schema::table($tbl_name, function (Blueprint $table) {
    MigrationSet::columnDef($table,$this->add_col_name);
});

upメソッドの設定

upメソッドでは、追加対象のテーブル配列をforeachで処理するようにします。処理をする前に追加対象のテーブルが存在することと、そのテーブルに追加対象のカラムがないことをチェックすることが可能です。

if(Schema::hasTable($tbl_name) && !Schema::hasColumn($tbl_name,$this->add_col_name))

MySQLの場合、afterの設定によって特定のカラムの後に追加が可能です。こちらも追加対象のテーブルにafter対象のカラムがあることをチェックすることが可能です。

if(Schema::hasColumn($tbl_name,$this->aft_col_name))

ある場合はafterを設定し、ない場合はafterを設定しないようにします。
MigrationFunc::columnDefの設定により、afterを続けて設定することができます。

MigrationSet::columnDef($table,$this->add_col_name)->after($this->aft_col_name);

これらをまとめたupメソッドは以下のようになります。

    public function up()
    {
        foreach($this->tbl_array as $key => $tbl_name){
            if(Schema::hasTable($tbl_name) && !Schema::hasColumn($tbl_name,$this->add_col_name)){
                if(Schema::hasColumn($tbl_name,$this->aft_col_name)){
                    //MigrationSet後にafterを実行
                    Schema::table($tbl_name, function (Blueprint $table) {
                        MigrationSet::columnDef($table,$this->add_col_name)->after($this->aft_col_name);
                    });
                }else{
                    //afterなし
                    Schema::table($tbl_name, function (Blueprint $table) {
                        MigrationSet::columnDef($table,$this->add_col_name);
                    });
                }
            }
        }   
    }

こちらを実行すると、追加対象のテーブルに同じカラムが追加することができます。

downメソッドの設定

downメソッドでも、追加対象のテーブル配列をforeachで処理するようにします。処理をする前に追加対象のテーブルが存在することと、そのテーブルに追加対象のカラムがあることをチェックすることが可能です。

if(Schema::hasTable($tbl_name) && Schema::hasColumn($tbl_name,$this->add_col_name))

downメソッドでは追加したカラムの削除を行います。カラムの削除はdropColumnで行います。

$table->dropColumn($this->add_col_name);

これらをまとめたdownメソッドは以下のようになります。

    public function down()
    {
        foreach($this->tbl_array as $key => $tbl_name){
            if(Schema::hasTable($tbl_name) && Schema::hasColumn($tbl_name,$this->add_col_name)){
                Schema::table($tbl_name, function (Blueprint $table) {
                    $table->dropColumn($this->add_col_name);
                });
            }
        }
    }

こちらを実行すると、追加対象のテーブルに追加したカラムを削除することができます。

まとめ

今回はLaravelのマイグレーションの我々の活用方法のうち複数テーブルへの同じカラムの追加方法を紹介しました。

以上

【関連するリンク】 www.prj-alpha.biz www.prj-alpha.biz www.prj-alpha.biz www.prj-alpha.biz www.prj-alpha.biz

【スポンサーリンク】