20190218のlaravelに関する記事は5件です。

axiosでPOSTした画像をLaravel APIで保存する

タイトルの通りです。画像やファイルのstorage保存の記事はいくつか見かけましたが、jsからPOSTする記事についてはあんまり見かけなかったので書きました。
この記事ではaxios経由で画像をPOST、LaravelのAPI処理に渡しているサンプルコードを簡単に説明します。概要は以下の通りです。

  1. canvasに画像を描画し、blobデータを作成
  2. blobをformDataにappendして、axiosでPOST
  3. POSTされたblobファイルを、Laravel API側で処理・保存

View側の処理

データのBLOB化

以下の処理かtoBlobを使ってCanvasに描画した画像ファイルをblob化します。

index.vue
// Canvasのデータをblob化
const type = 'image/png';
const dataurl = this.canvas.toDataURL(type); // this.canvasは用途に合わせて書き換え
const bin = atob(dataurl.split(',')[1]);
const buffer = new Uint8Array(bin.length);
for (let i = 0; i < bin.length; i++) {
    buffer[i] = bin.charCodeAt(i);
}
const blob = new Blob([buffer.buffer], {type: type});

"multipart/form-dataのデータをPOSTするので、blobファイルをFormDataインタフェースにappendする形でデータを作成します。

index.vue
const data = new FormData();
data.append('photo', blob, 'image.png'); //'photo'というkeyで保存

blobを格納したdataをaxios.postの第二引数にセットすれば、POST可能です。

index.vue
axios.post('/api/photo', data, {
        headers: { 'content-type': 'multipart/form-data' }
    })
    .then(res => {
        console.log('success')
    }).catch(error => {
        new Error(error)
    });

Laravel API側の処理

api用のControllerで設定したstore定義内に、受け取ったblobデータをファイルとして保存するための処理を書きます。View側でFormData内にappendしたphotoデータを$requestから参照し、storeAsメソッドを実行することで簡単に保存が可能です。

IndexController.php
  public function store(Request $request)
  {
      // ファイル名を取得
      $filename = $request->photo->name;

      // blobデータをstorageに保存する
      // diskの指定を特にしなければ、例の場合。`storage/app/images/`に画像が保存される
      $path = $request->photo->storeAs('images', $filename);
  }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

mysqlndとphp-pdoを導入するもcould not find driver【php72】

  • 環境:CentOS7
  • nginx
  • MariaDB
  • php7.2
[root@---]$ php -v
PHP 7.2.15 (cli) (built: Feb  5 2019 18:05:51) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

issue

PDO接続にてcould not find driverエラー。
image.png

pdoは読み込まれており、下記モジュールは導入済み。
- 加え、systemctl reload php-fpm, nginx済み。

[root@---]# yum list installed | grep mysql
php-mysqlnd.x86_64                      7.2.15-1.el7.remi          @remi-php72
[root@---]# yum list installed | grep pdo
php-pdo.x86_64                          7.2.15-1.el7.remi          @remi-php72

解決策

[root@---]$ php -r "echo phpinfo();" | grep PDO
PDO
PDO support => enabled
PDO drivers =>

上記にて読み込まれていないことが発覚。

  • $ sudo yum -y install php72-php-mysql

結果
* $ php -r "echo phpinfo();" | grep PDO

PDO
PDO support => enabled
PDO drivers => mysql, sqlite
PDO Driver for MySQL => enabled
PDO Driver for SQLite 3.x => enabled

接続良好。

補遺

PDOテスト用に。

<?php
try {
    $pdo = new PDO('mysql:host=localhost;dbname=vanilo;charset=utf8','root','kubosuke',
                   array(PDO::ATTR_EMULATE_PREPARES => false));
} catch (PDOException $e) {
    exit('データベース接続失敗'.$e->getMessage());
}
?>

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

Laravel 関連テーブルでの検索方法

前提

Presidentモデル(社長) 1人 に対して
Shopモデル(お店) 複数  が紐づいている状態

Laravelの関連テーブルのカラムで検索したい。

社長の名前にがつくお店一覧を出したい場合はこれ

return Shop::with('president')
                ->select('*', 'presidents.name as president_name', 'shops.name as shop_name')
                ->leftJoin('presidents', 'presidents.id', '=', 'president_id')
                ->where('presidents.name', 'LIKE', '%' .  . '%')
                ->groupBy('presidents.id');

解説

お店にも、社長にも name というカラムがある。
joinするとnameカラムが社長の名前で上書きされてしまう。

なので select as を使って別の名前に最初に定義し直す。

->select('*', 'presidents.name as president_name', 'shops.name as shop_name')

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

Laravel 関連テーブルのカラムで検索する方法

前提

Presidentモデル(社長) 1人 に対して
Shopモデル(お店) 複数  が紐づいている状態

Laravelの関連テーブルのカラムで検索したい。

社長の名前にがつくお店一覧を出したい場合はこれ

return Shop::with('president')
                ->select('*', 'presidents.name as president_name', 'shops.name as shop_name')
                ->leftJoin('presidents', 'presidents.id', '=', 'president_id')
                ->where('presidents.name', 'LIKE', '%' .  . '%')
                ->groupBy('presidents.id');

解説

お店にも、社長にも name というカラムがある。
joinするとnameカラムが社長の名前で上書きされてしまう。

なので select as を使って別の名前に最初に定義し直す。

->select('*', 'presidents.name as president_name', 'shops.name as shop_name')

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

[一時メモ]Laravelのbladeのsessionについて

bladeのsessionってなんだこれ?

フラッシュデータを保存するリダイレクト

を読んでください。

php側
Route::post('user/profile', function () {
    // ユーザープロフィールの更新処理…

    return redirect('dashboard')->with('status', 'Profile updated!');
});
blade.php
@if (session('status'))
    <div class="alert alert-success">
        {{ session('status') }}
    </div>
@endif

ザックリ言うと、redirect()->with()のメソッドの中でsessionに一時的に保存しているようです。

詳しくは後ほど調べます。

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