20210119のlaravelに関する記事は14件です。

【Laravel6】セッションの値が多重連想配列の時に特定のkeyに対応するvalueを更新する方法

はじめに

あまりググっても出てこなかった方法なので、残しておきます。
この選択肢があればセッションの扱える幅が広がると思います。

対象のセッション(仮)

例えば

//セッションからkeyが'cartData'の値を取得
$request->session()->get('cartData');

これで取得した値が以下の場合を想定する

[
    [0] => [
        'item_name' => 'ジャケット',
        'item_count' => 1,
    ],
    [1] => [
        'item_name' => '靴下',
        'item_count' => 3,
    ],
    [2] => [
        'item_name' => 'バッグ',
        'item_count' => 2,
    ],
]

実現したいこと

靴下の個数を3 → 5個にしたい!

セッションの特定のkeyに対応するvalueを更新する方法

以下のコードで更新できる

$request->session()->put('cartData.1.item_count', 5);

->put()の第1引数に連想配列の階層を文字列連結することで特定のkeyのvalueにアクセスすることができる。

config()と同じ感じですね

さいごに

ドキュメントにも明確には記載されていなかった...

Laravel 6.x HTTPセッション

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

laravel6,7,8インストール

Laravel6

terminal
composer create-project --prefer-dist laravel/laravel ●●● "6.*"

composer require laravel/ui:^1.0 --dev

Laravel7

terminal
composer create-project --prefer-dist laravel/laravel ●●● "7.*"

composer require laravel/ui:^2.4

Laravel8

terminal
composer create-project --prefer-dist laravel/laravel ●●● "8.*"

composer require laravel/ui

vue、テーブル作成

terminal
php artisan ui vue

//authがいる場合
php artisan ui vue --auth

php artisan migrate

npm

terminal
npm install

コンパイル

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

laravel6,7,8別プロジェクト作成

Laravel6

terminal
composer create-project --prefer-dist laravel/laravel ●●● "6.*"

composer require laravel/ui:^1.0 --dev

Laravel7

terminal
composer create-project --prefer-dist laravel/laravel ●●● "7.*"

composer require laravel/ui:^2.4

Laravel8

terminal
composer create-project --prefer-dist laravel/laravel ●●● "8.*"

composer require laravel/ui

vue、テーブル作成

terminal
php artisan ui vue

//authがいる場合
php artisan ui vue --auth

php artisan migrate

npm

terminal
npm install

コンパイル

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

【Laravel】artisanコマンドでやりたいこと、ここで見つかる

はじめに

「この記事を見ればお目当てのartisanコマンドが(だいたい)全て見つかる!」っていう記事です。

以前書いたGitでやりたいこと、ここで見つかるのartisanコマンドバージョンです。

僕自身が「あのartisanコマンドどう書くんだっけ?」ってなった時に見返す用でもありますのでストックしておくと便利かなと思いますw

※この記事では全てのartisanコマンドを網羅したわけではありません。

.envのAPP_ENVを表示

$ php artisan env

Laravelの内蔵サーバーを起動(PHPのビルドインサーバー)

$ php artisan serve

DBとの接続状況を確認

$ php artisan migrate:status

コントローラー作成

$ php artisan make:controller {任意の名前}Controller

コントローラー作成(主要7アクションを自動的に生成)

$ php artisan make:controller {任意の名前}Controller --resource

シングルアクションコントローラー作成

$ php artisan make:controller {任意の名前}Controller --invokable

マイグレーションファイル作成(テーブル作成用)

$ php artisan make:migration create_{テーブル名}_table —-create={テーブル名}

マイグレーションファイル作成(カラム追加用)

$ php artisan make:migration add_column_{テーブル名}_table —-table={テーブル名}

※ファイル名の付け方には個人差あり
※これがデファクトスタンダードではない

マイグレーション実行

$ php artisan migrate 

現在のテーブルを全削除してマイグレーションやり直し

 $ php artisan migrate:fresh

データベース全体を作り直す

$ php artisan migrate:refresh

マイグレーション実行&シーディング実行

$ php artisan migrate --seed

マイグレーションロールバック(最後に実行したマイグレーションを元に戻す)

$ php artisan migrate:rollback

全てのマイグレーションをロールバックする

$ php artisan migrate:reset

シーダーファイル作成

$ php artisan make:seeder {任意の名前}Seeder

{任意の名前}TableSeederにする場合もアリ

シーディング実行

$ php artisan db:seed

特定のシーダーファイルを実行

$ php artisan db:seed --class={実行するシーダーファイル}

モデル作成

$ php artisan make:model {任意の名前}

(例)テーブル名がusersなら{任意の名前}はUserにする

モデルとファクトリーを同時に作る

$ php artisan make:model {任意の名前} —-factory

(例)テーブル名がusersなら{任意の名前}はUserにする

ルーティング一覧を表示

$ php artisan route:list

フォームリクエスト作成(バリデーションに使用)

$ php artisan make:request {任意の名前}Request 

ポリシー作成

$ php artisan make:policy {任意の名前}Policy --model=Article

通知クラス作成

$ php artisan make:notification {任意の名前}Notification

ファクトリー作成(モデルと対応させる)

$ php artisan make:factory {モデル名}Factory —-model={モデル名}

テスト作成

$ php artisan make:test {任意の名前}ControllerTest

tinker起動

$ php artisan tinker

さいごに

順次追記予定です

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

xamppでバーチャルホストを設定する(laravel)

概要

三か月前にエンジニアになったばかりですが、この前新規のプロジェクトでバーチャルホストとやらを設定し、開発をスタートして、これは便利だなーと感じたので記録しておきます。

バーチャルホストとは?

その名の通り、仮想のホストのことですね。1つのサーバーで複数のドメインを運用できるみたい。
例えば、3つのプロジェクトを平行して開発しているとき、プロジェクトごとコードを書くたびにサーバーを切り替えるのはすごくめんどうだと。だからバーチャルホストを設定してプロジェクトaは「aaa.com」プロジェクトbは「bbb.com」プロジェクトcは「ccc.com」みたいにドメインを設定することができる。

手順

手順はざっくりとこんな感じ。
この手順に入る前にapacheは停止させてくださいね。
1.hostsファイルの編集
2.httpd-vhostsファイルの編集
3.envファイルの編集

1.hostsファイルの編集

hostsファイルの場所は下記。
C:\Windows\System32\drivers\etc\hosts

ただ、hostsファイルはそのままでは編集できません。
なので、一旦デスクトップへ移しましょう。
その際に警告が出ますが、「続行」を押して問題ないです。
デスクトップで編集したら、元の場所へ戻す。

hostsファイルの一番下に以下を追加
aaaの部分は任意の文字で。

127.0.0.1  aaa.com

2.httpd-vhostsファイルの編集

ファイルの場所は下記。
C:\xampp\apache\conf\extra\httpd-vhosts

一番下に下記を追加。
htdocs配下に作業フォルダとかを作っている人はそのパス通りに。

<VirtualHost *:80>
DocumentRoot "C:/xampp/htdocs/aaa/public"
ServerName localhost
</VirtualHost>

<VirtualHost *:80>
DocumentRoot "C:/xampp/htdocs/aaa/public"
ServerName aaa.com
</VirtualHost>

3.envファイル編集

laravelにはプロジェクト直下に.envファイルというものがあるかと思います。
.env上部のAPP_URLとやらを手順1と2で設定したドメインを記述。

APP_NAME=aaa
APP_ENV=local
APP_KEY=それぞれ取得したkey
APP_DEBUG=true
APP_URL=aaa.com

これでapacheを立ち上げて、aaa.comをブラウザに入力すると表示されます。

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

【Laravel】動的に生成した文字列を直接ファイル形式でレスポンスする方法。

自分用のメモとして残します。

文字列をダウンロードファイルとしてレスポンスを返す方法をメモ。
→つまりレスポンス用にわざわざファイルを保存しない。

■やり方

\Responseクラスでレスポンス用のオブジェクトを明示的に作成する。

$content = 'hoge,hoge,hoge';
$headers = [
    'Content-type'        => 'text/plain; charset=utf-8',
    'Content-Disposition' => 'attachment; filename="download.txt"',
];
$response = \Response::make($content, 200, $headers);

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

初心者がLaravelでアプリを作るまで(2)

基本設計とテーブル定義の相談を終えて、コードを書いていくことに、、
でもいきなりコードを書いていくことは難易度が高すぎるので、スクールのカリキュラムで覚えたことに沿って少しずつ書いていく。

とりあえず、MVCモデルとルーティングの流れでページを作るということはわかっているので、まずviewの部分を書いて、
それからcontroller、routingという順番で書いていこう。
先生が言うには、順番は決まっているわけではないらしいので適当に決めてみました。
DBとmodelの部分は少し自分にとって難しいので、後で書くことにする。

image.png

とりあえず、投稿ページの形だけは完成。

形を整えるために、bootstrapを使ったけど、使うのが難しい。
しかも、スクールのカリキュラムにbootstrapに関する記述はほぼなかったので、質問投稿機能と自分で調べながら書いてみたけど、一ページ作るのに果てしない時間がかかりました、、

初心者は、フロントすらなかなか整えれない、、

それから、複数ページを時間をかけながらつくってみました。
何枚か画像を載せておきます。

image.png

↑投稿一覧ページ
これはカリキュラムにやり方が、書いてあったので少し短めの時間で完成しました。
投稿する機能もついでに書いてみましたが、理解しにくい部分もありながら実装してみました。

何せ、一つのページに一つの機能をつけるのに時間がとてもかかる、、
書いてはエラー書いてはエラーの繰り返し、、

image.png

↑マイページ
あとは、マイページもつくってみましたがここから色々データを持ってくる機能だったり、内容を変更する部分を書いていかなくては、、

とりあえずフロント画面は徐々に完成していっているので、このままがんばります!
問題はページとページの中身をうまく遷移したりデータを持ってくるコードのとこやなあ

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

Laravel カラム追加 外部キーカラムの追加と削除

はじめに

・カラムを後から追加したい
・外部制約キーをつけたカラムを追加したい

向けの内容となっています

マイグレーション 外部キーカラムを追加

1.migrationファイルの作成
例) offersテーブルにuser_idカラムを追加したい場合

migration
$ php artisan make:migration add_user_id_to_offers_table --table=offers

命名規則は add_(カラム名)to(テーブル名)_table --table=(テーブル名)
でファイル名を作成します

--table=(テーブル名)の部分では、カラムを追加のテーブルを指定して行っています。

migration
public function up()
{
    Schema::table('offers', function (Blueprint $table) {
      $table->integer('user_id')->unsigned();
      $table->foreign('user_id')->references('id')->on('users')->OnDelete('cascade');
    });
}
$ php artisan migrate

さあ、これでマイグレーションするとカラム作成だ!

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails

と思いきや,うまく外部制約キーのカラムがうまく作成できません。

調べてみると、原因は、「users.idに存在しないデータがoffers.user_idに存在しているから」だそうです。
上記のマイグレーションをしたときはoffersテーブルにはuser_idのカラムが入っていましたが、user_idが0でした。

もともと外部キー制約は
「参照元フィールドに存在するデータのみ参照先フィールドのデータに存在できる」
という仕様です。

そもそも,user_idが存在しない場合にoffers.user_idが存在しているのは外部キーの設定ができるはずもありません。

解決方法

今回の場合の対策として
1. 整合性の取れないデータはdeleteする
2. usersにデータを追加する
3. offersテーブルのuser_idをnullにする

外部制約のキーでデータが一致しないとエラーになります。

そのときに
php artisan migrate:refresh
php artisan migrate:fresh
など一旦データを削除してまたmigrateをするとうまくいきますが、問題点として 

すでにあるデータを削除してしまう
毎回、データを削除しないといけない
などがあります。

本来なら最初にちゃんとテーブル設計したらと思いますが、開発の途中で機能追加するときもこういった場面があるのではないかなと思い記事を書いてみました。

データを挿入するなら
・seedやfactoryを使ってデモデータを挿入する

などのやり方があります。

今回僕がやった方法は, 外部制約キーにnullableを追加して解決しました。

migrate
public function up()
    {
        Schema::table('offers', function (Blueprint $table) {
            $table->integer('user_id')->unsigned()->nullable();
            $table->foreign('user_id')->references('id')->on('users')->OnDelete('cascade');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('offers', function (Blueprint $table) {
            $table->dropForeign('offers_user_id_foreign');
        });

        // Schema::table('offers', function (Blueprint $table) {
        //     $table->dropColumn('user_id');
        // });
    }

nullable()を追加すれば、migrateがうまくいきます。
down()のところには外部制約キーを削除できるように
$table->dropForeign('offers_user_id_foreign');

に設定します。

ただ、外部キーをNullにするのはどうかなぁと考えてしまいます。
ここら辺はSQLの知識が必要だなと思っています。

外部キー制約カラムの追加を試している方はぜひ参考にしてみてください。

参考

Laravel7.x データベース: マイグレーション

Laravelで、外部キー制約の処理で SQLSTATE[23000] エラーが出て、マイグレートできません。

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

【Laravel】.envファイルの値を確認する方法。env関数の使い方と注意点。

Laravelで.envファイルに記述した値が反映されているのか確認する方法について。

envヘルパ関数

Laravelにデフォルトで用意されている関数。.envファイルの指定した値を呼び出せる。

env('環境変数名', 'デフォルト値')

  • 環境変数がnullの場合にデフォルト値が表示される。
  • デフォルト値はなくてもいい。

値がきちんと読み込まれているか確認するにはデフォルト値を設定しておく方がわかりやすい。

▼記述例

env('DB_CONNECTION')

env('DB_CONNECTION', 'default')


確認手順

実際にブラウザに表示してみる。

1. ビューの作成

rousources > views > env.blade.php

テストとして、DBに関する3つの環境変数を表示してみる。

env.blade.php
<p>{{ env('DB_CONNECTION', 'default')}}</p>
<p>{{ env('DB_HOST', 'default')}}</p>
<p>{{ env('DB_PORT', 'default') }}</p>



▼(補足)対象のデータ

.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306

2. ルーティング

routes > web.php

web.php
//env
Route::get('env', function () {
    return view('env');
});

3. ブラウザに表示

ターミナル
#サーバー起動
php artisan serve

http://127.0.0.1:8000/env にアクセス

image.png

環境変数の値が読み込まれていることが確認できた。


表示されない場合の対処法

キャッシュが読み込まれてしまい、.envファイルが読み込まれない場合がある。

以下コマンドでキャッシュをクリアする。

$ php artisan config:clear

image.png

  ↓

ターミナル
$ php artisan config:clear
Configuration cache cleared!

  ↓

image.png


ローカル環境で実行してはいけないコマンド

php artisan config:cacheを実行すると、.envファイルを読み込みに行かなくなる。

すべての値が.envがきちんと記述されているのに、ブラウザの表示がnull(上記設定ではdefault)になる場合は、このコマンドが実行された可能性がある。

php artisan config:cacheとは?

本番環境用のコマンドで、すべての設定ファイルを一つにまとめることで高速化するためのコマンド。

設定が頻繁に変わる開発環境では推奨されていない。

また、実行すると、キャッシュが作成され、.envファイルを読み込みに行かなくなる点も注意が必要。

$ php artisan config:cache
Configuration cache cleared!

Laravel公式 設定キャッシュ

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

【メモ】LaravelのIlluminateの場所

ここにあります。

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

Laravel/UIでの簡単ログイン機能の実装

準備

Laravel/uiをインストールしてとりあえず基本のログイン機能が使えることを確認しておく。
※php8では使えません。

前提

セキリュティへの考慮はしていません。
ポートフォリオを作る際にできたらいいなと思ったので書いています。
コードを書くのには慣れていないので、あくまで参考程度でお願いします。

実装

Laravel/UIの処理が全部はわかりませんが、インストールの際にviews/authlogin.blade.phpが作成されています。
この中を見てみると

login.blade.php
<form action="{{ route('login') }}" method="POST">
...
</form>

と書かれており、このrouteに渡してあげればいいみたいです。

login.blade.php
<form method="POST" action="{{ route('login') }}">
    @csrf //この記述がないとセッションエラーが起きる
    <button type="submit" >{{ __('Guest Login') }}</button>
    <input type="hidden" name="email" value="...">
    <input type="hidden" name="password" value="...">
</form>
//valueには自分が作成したいユーザの値をいれる。

次にlogin.blade.phpの表示を命令している部分が、少しややこしいですが、vendor/laravel/ui/auth-backend/AuthenicatesUsers.php内にありました。

AuthenicatesUsers.php
public function showLoginForm()
    {   
        return view('auth.login', compact('test'));
    }
//ここが該当部分です。

そこでDBにゲストで使いたいユーザが登録されている場合にtrueを返し簡単ログインできるようにしたいと思います。

AuthenicatesUsers.php
public function showLoginForm()
    {
        if(User::where('email','LIKE', '...')->get() != '[]'){
            $test = true;
        }else{
            $test = false;
        }
//if文で ... != '[]'としているのはsqlを発行した際、見つからない場合の返り値が'[]'のため

        return view('auth.login', compact('test'));
    }

そしてlogin.blade.phpで$testを読み取ればできる。

login.blade.php
@if($test == true)
  <form method="POST" action="{{ route('login') }}">
    @csrf
    <button type="submit" class="btn btn-primary">{{ __('Guest Login') }}</button>
    <input type="hidden" name="email" value="test@test.com">
    <input type="hidden" name="password" value="password">
  </form>
@endif

とりあえずこれで簡単ログインができる。
しかし、最初からゲストユーザはDBに無くエラーが出るので、DBに無い場合はregisterに渡して登録させればいい。

login.blade.php
@if($test == true)
  <form method="POST" action="{{ route('login') }}">
    @csrf
    <button type="submit" class="btn btn-primary">{{ __('Guest Login') }}</button>
    <input type="hidden" name="email" value="test@test.com">
    <input type="hidden" name="password" value="password">
  </form>
@else
  <form method="POST" action="{{ route('register') }}">
    @csrf
    <button type="submit" class="btn btn-primary">{{ __('Guest Login') }}</button>
    <input type="hidden" name="name" value="test">
    <input type="hidden" name="email" value="test@test.com">
    <input type="hidden" name="password" value="password">
    <input type="hidden" name="password_confirmation" value="password">
  </form>

@endif 

これで簡単ログインが実装できた。

注意

本番では100%使いません。
ポートフォリオで見てもらう人の負担を減らすみたいな用途くらいかな?
再度、コードを書くのには慣れていないためよくない書き方をしているかもしれません。もしこうした方がいいよ!などありましたら是非教えていただきたいです。

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

Laravel 地理座標を文字と数字の文字列にエンコードするジオハッシュアルゴリズム

saikiran/geohashライブラリをインストール

saikiran/geohash

composer require saikiran/geohash

地理的な位置を文字と数字の短い文字列にエンコードします。

use Sk\Geohash\Geohash;
$g = new Geohash();

public function run(Faker $faker)
{  
 // 緯度,経度,文字数
'geohash' => $g->encode($faker->latitude(), $faker->longitude(), 12),
}

文字と数字の文字列を緯度と経度にデコードします。

use Sk\Geohash\Geohash;
$g = new Geohash();

public function run(Faker $faker)
{  
'geohash' => $g-> decode('エンコードされた文字列', 12),
}
  • テーブルに緯度・経度を文字列かしたレコードを保持しておけば色々使い回しが出来そう!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】.envを編集したが、migration時に反映されなかった

事象

Laravelのmigrationを掛けたかった。
しかし.envのDB名が間違っていたため、修正をかけたが、反映されず修正前のDB名でエラーが出た。

変更前

.env
~
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=before #修正前
DB_USERNAME=root
DB_PASSWORD=
~

変更後

.env
~
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=after #修正後
DB_USERNAME=root
DB_PASSWORD=
~

しかし、beforeのDB名でエラー出力されました。

$ php artisan migrate

   Illuminate\Database\QueryException  : SQLSTATE[HY000] [1049] Unknown database 'before' (SQL: select * from information_schema.tables where table_schema = before and table_name = migrations and table_type = 'BASE TABLE')

  at /Library/WebServer/Documents/laravel/vendor/laravel/framework/src/Illuminate/Database/Connection.php:669
    665|         // If an exception occurs when attempting to run a query, we'll format the error
    666|         // message to include the bindings with SQL, which will make this exception a
    667|         // lot more helpful to the developer instead of just the database's errors.
    668|         catch (Exception $e) {
  > 669|             throw new QueryException(
    670|                 $query, $this->prepareBindings($bindings), $e
    671|             );
    672|         }
    673| 

  Exception trace:

  1   Doctrine\DBAL\Driver\PDOException::("SQLSTATE[HY000] [1049] Unknown database 'before'")
      /Library/WebServer/Documents/laravel/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:31

  2   PDOException::("SQLSTATE[HY000] [1049] Unknown database 'before'")
      /Library/WebServer/Documents/laravel/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:27

  Please use the argument -v to see more details.
$

解決策

config(?)のキャッシュクリア

$ php artisan config:clear
Configuration cache cleared!

参考:Laravel キャッシュクリア系コマンドなど
https://qiita.com/Ping/items/10ada8d069e13d729701

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

【Laravel】【mac】ドキュメントルートにしかアクセスできない

環境

macOS Catalina 10.15.7

$ apachectl -v
Server version: Apache/2.4.41 (Unix)
$ php artisan --version
Laravel Framework 6.20.12

事象

ドキュメントルート以外のページにアクセスできない。
(404 Not Foundとなる)

解決策

$ sudo vim /etc/apache2/httpd.conf
~
LoadModule rewrite_module libexec/apache2/mod_rewrite.so ->このコメントアウトを外す
~
$ sudo apachectl restart

これだけで治りました。

ご参考:https://qiita.com/u-akihiro/items/c7a5bb38c34858d00c2a
Ubuntu版のご投稿ですが、内容はほぼ一緒です。

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