エンジニアの卵の成長日記

ふわっちで配信してますhttps://whowatch.tv/profile/w:kurowasi2525

Laravel+PostgreSQLでの異なる型のINNER JOINの方法

Laravelはデータベースクレリビルダってのがある

データベースクエリビルダはスラスラと書ける(fluent)便利なインターフェイスで、クエリを作成し実行するために使用します。アプリケーションで行われるほとんどのデーターベース操作が可能で、サポートしている全データベースシステムに対し使用できます。

こいつのおかげでSQL文を書かなくて済む

SELECT文とかもこんな感じで書ける

$users = DB::table('users')->select('name', 'email as user_email')->get();

今回問題のINNER JOIN文もこんな感じでかける

$users = DB::table('users')
->join('contacts', 'users.id', '=', 'contacts.user_id')
->join('orders', 'users.id', '=', 'orders.user_id')
->select('users.*', 'contacts.phone', 'orders.price')
->get();

今回ぶち当たった壁は違う型でのINNER JOINする方法

上記の例の場合、usersテーブルのidがint8・contactsテーブルのuser_idがvarcharの場合、

型が違うためjoinできない

CASTすればよいと思い、試してみた

$users = DB::table('users')
            ->join('contacts', 'users.id', '=', 'contacts.user_id::int')
            ->get();

contacts.user_id::intなんて存在しないよって怒られる

原因は多分これみたい

LaravelクエリビルダはアプリケーションをSQLインジェクション攻撃から守るために、PDOパラメーターによるバインディングを使用します。バインドする文字列をクリーンにしてから渡す必要はありません。

解決方法はDB::raw()メソッド

たまにクエリの中でSQLを直接使用したいことがあります。このようなSQLでは文字をそのまま埋め込むだけですので、SQLインジェクションをされないように気をつけてください! エスケープなしのSQLを使用する場合はDB::rawメソッドを使用します。

こんな感じにすれば完了

$users = DB::table('users')
            ->join('contacts', 'users.id', '=', DB::raw('contacts.user_id::int'))
            ->get();


参考サイト
データベース:クエリビルダ 5.3 Laravel

NVMWで最新verがインストールできない(404 Not Found)

概要
NVMWで最新verがインストールできないので,無理やり最新verを使えるようにした.


目次
1. 背景
1.1. nvmwとは2. 目的
3. エラー内容
4. 解決策
5. 感想


1. 背景
卒業研究で使っているプログラムは,Macで開発していた.(Macは開発環境を整えやすいから)

だが,あのペラペラのキーボードと小さい画面では,開発の効率が悪いのでWindowsで開発することにした.

そこで問題が起きた.nodeのバージョンが古くてletをエラー扱いする.

Windowsではnvmwを使っているのだが,昔からv0.10.21以外のバージョンをインストールできない問題があった.


1.1. nvmwとは
nvmのWindows版.nodeのバージョンを管理できる.

続きを読む

Eclipseを使ってSelenium-WebDriverを使ってみた

概要

Selenium3 WebDriverを使ってChromeを自動操作する,環境構築とサンプルコードを作成する.


目次

1. 背景
1.1. Selenium WebDriverとは2. 目的
2.1. JavaでのWebDriverの使用方法2.2. Eclipseとは2.3. Jarファイルとは2.4. Mavenとは2.5. Gradleとは3. 環境構築
3.1. WebDriverを取得3.2. EclipseにJarを読み込ませる3.2.1. プロジェクト作成3.2.2. Jarファイルを参照する3.2.3. Chromeの場合3.3. サンプル作成4. 感想
5. 参考文献


1. 背景

卒業研究でSelenium WebDriverを使うので,WebDriverの知識が必要.


1.1. Selenium WebDriverとは

Selenium WebDriverは,プログラミング言語のコードからブラウザ操作が可能なライブラリ.

JavaRubyJavaScriptなど,各言語のライブラリとして提供されている.

続きを読む

スマホのWebブラウザで画像が荒い原因とは?

1. 背景
2. 目的
3. 調査結果3.1. 解像度の意味は2つある3.2. 解像度3.3. ピクセル/dpi/インチの関係3.4. Retinaディスプレイ登場3.5. Retinaディスプレイでの解決策4. 結論
5. 感想
6. 参考文献


1. 背景

バイト先で,スマホのブラウザでWebサイトを表示すると,画像が荒いという問題があった.

kurowasi2525.hatenablog.com

上の方は,ピクセルサイズを大きくすることなく,解像度を上げることで解決したい.

僕は,ピクセルサイズを大きくしないと画質は上がらないと考えていた.

続きを読む

Windows10でPleiades All in Oneを使わずにEclipseの環境を構築した

概要

Selenium WebDriverを使うため,Eclipseの環境が必要なので構築してみた.


目次

1. 背景
1.1. Seleniumとは1.2. Selenium WebDriver1.3. Eclipse2. 目的
2.1. Pleiadesを利用しない理由3. 環境構築
3.1. Eclipseのインストール3.2. Javaプロジェクトの作成3.3. クラスの作成3.4. HelloWorldコードの記述3.5. 実行4. 感想
5. 参考文献


1. 背景

卒業研究でSeleniumSelenium WebDriverを使うため,Eclipseの環境が必要なので構築してみた.

WebDriverの言語はJavaにした.

本当はNode.jsにしたかったのだが,僕の内定先はJavaのシステムで,

Seleniumを使っているみたいなので,目先の利益を追ってJavaを選んだ笑.

続きを読む

Laradockを使っていて、Postgresに接続できなかった問題

目次
1. 背景
2. 解決策
3. 余談


1. 背景


バイト先でLaradockを使っているのだが,Postgresに接続できない問題があった.

ローカルからLaradockでのPostgresに

 ホスト:localhost
 ユーザ:default
 パスワード:secret
 ポート:5432
 データベース:default

で接続しようとするとできなかった.

ローカル環境には,Laradockで作ったものではなく,brewコマンドでインストールしたPostgresが起動していた.

brewコマンドで入れたPostgresに対しての接続はできた.

同じポート5432に2つ作ることはできないだろうけど,

ここらへんはDockerの知識が足りないため,勉強しようと思います.

brewコマンドで起動したPostgresを落とせばいいのだろうが,

こちらも違う環境で使っていて,デーモン化?で自動起動するようになっているので,

後で面倒になりそうだから,止めたくない.


ワークスペースに入って,Postgresに接続しようとするが,

以下のようなエラーが出る.

$ docker-compose exec workspace bash
# psql -l

psql: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?psql: could not connect to server: No such file or directory

/var/run/ ディレクトリまでは存在するのだが,postgresqlというディレクトリは見当たらない.

色々調べて,試したのだが解決しない.

続きを読む

バイトでRepositoryパターンを使ったよ

今日のタスクは前回の続き
kurowasi2525.hatenablog.com


前回はIoCとは何かなどを理解できていなかった
この一週間の暇な時間で

を読んでIoCやDIを勉強したから大丈夫だろう
(この本はLaravelの概念系が書いてある本。パソコンの前でカタカタやりながら読む本ではないですね)
(電車などで読むのには適していると思う)


qiita.com


1. まずはModelに対応するRepositoryを作成
(今回はすでにRepositoryが作成してあった)

2. 次にControllerに対応するアプリケーションを作成

3. Service Providerに作成したアプリケーションをmake&bind

4. 次にControllerに対応するReponseを作成

5. Service Provideに作成したReponseをmake&bind

6. 次にControllerに対応するResponseを作成

7. Service Provideに作成したResponseをmake&bind



一応流れが完成した
後はvalidationを行う機能・DBに情報を記録する機能を作成するのみ



Laravelのvalidationについて調べていこう


こちらの記事が便利そう
qiita.com



DBの仕様と詳細設計の仕様を見ながらValidationコードを書いていく

上記の理由により、まぁまぁ適当な感じで完成

その後DBに情報を記録する機能の作成も終わり



リポジトリーパターンというか、今回のプロジェクトのルールに従うのに大きく時間を取られました
今回のは、

自作のControllerは、【自作のApplication】と【自作のRequest】と【自作のResponse】と【Request】と依存関係
自作のApplicationは、【自作のRepository】と依存関係

みたいにとても複雑になっていた
(上記の書き方で合っているのかわからない)