windows7(64bit)にRuby on Rails + mysql環境[追加]

やっぱりだめだった。64bitだと"rails g"や"rails s"でコケる。
mingw-w64-install.exeを落としてきてインストール

gendef.exe libmysql.dll

dlltool -v --dllname libmysql.dll --def libmysql.def --output-lib libmysql.lib

copy libmysql.dll C:\Ruby200-x64\bin

copy libmysql.lib C:\Ruby200-x64\bin

gem mysql2 をやり直し

gem uninstall mysql2
gem install mysql2 ...

次にこのエラー

`rescue in create_default_data_source': No source of timezone data could be found. (TZInfo::DataSourceNotFound)
Please refer to http://tzinfo.github.io/datasourcenotfound for help resolving this error.

んで、

gem install tzinfo-data

Gemfileの以下のように64bit用に書き換え

gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw]

イケた~

windows7(64bit)にRuby on Rails + mysql環境

ハマった。。
どうしてもコケる。

gem install mysql2
・・・
checking for main() in -llibmysql... no
・・・

http://dev.mysql.com/downloads/connector/c/

  • ダウンロードして解凍かインストールしたディレクトリ/libにある

libmysql.dllをRuby/binにコピー

  • 再度実行
gem install mysql2 --platform=ruby -- '--with-mysql-dir="C:\o
pt\Ruby200-x64\mysql-connector-c-6.1.3-winx64"'

やっと通った。。

【Laravel】Vol.5 日本ロケール

これからDBの登録・更新には、updated_at,created_atに自動的にシステム時刻をセットしたり
バリデーションによる標準メッセージを使用しますが、
設定を日本時刻(JST)、メッセージを日本語に設定しておく必要があります。

■en -> ja
application/config/application.php

	'language' => 'ja',
	・・・
	'timezone' => 'Asia/Tokyo',

■name属性値に応じた日本語名称の追加
application/language/ja/validation.php

	'attributes' => array(
		'name' => '名称'
	),

phpソースですので、Apache再起動は不要です。

【Laravel】Vol.4 データベースからSELECT

Fluentクエリービルダーでは結合したSQLの結果で
同名の列が上書きされネストした構造での取得ができませんでした。
そこで、Eloquent ORMを使って結合したデータを取得していきます

基底になる業務テーブルをestimates、マスタをusersテーブルとして
取得します。

application/models/users.php

<?php
class Users extends Eloquent {
}
?>

規則に従ってたテーブル名、idとしているので特にフィールドは設けていません。
ルールはテーブル名=クラス名と、Eloquentをextendsすることです。

次に業務テーブルのモデルを作成し、Usersテーブルとの結合を表します。
ここでもルールに従い、Usersとの結合列をuser_idと命名規則に従ってテーブルを作成しています。

application/models/estimates.php

<?php
class Estimates extends Eloquent {
	// 結合(belongs)
	public function user()
	{
		return $this->belongs_to('Users');
	}
}
?>

これで、モデルの準備は完了です。次にコントローラーから結合してデータを取得してみます。

$list = Estimates::with(array('user'))
  ->order_by('seq_no', 'desc')
  ->get();

// estimatesテーブルのid列
var_dump($list[0]->id);

// usersテーブルのid列
var_dump($list[0]->user->id);

結合して取得したいテーブルをwithメソッドに指定し、チェインして順序の指定をして
getメソッド取り出しています。

【Laravel】Vol.3 データベース

データベースと連携です
今回はXamppのMySQLと連携していきます

まずデータベースを作成して、以下のテーブルを作成しました

CREATE TABLE `users` (
  `id` int(10) NOT NULL auto_increment,
  `name` varchar(10) NOT NULL,
  `passwd` varchar(10) NOT NULL,
  `desc` varchar(50) default NULL comment '説明',
  `auth` int(10) default NULL comment '権限',
  `delete_flg` int(1) default 0 comment '1:deleted',
  `updated_at` timestamp default 0,
  `created_at` timestamp default current_timestamp(),
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

データベースとの接続設定を行います
以下の情報を環境に合わせて書き換えます

[laravel]/application/config/database.php

'mysql' => array(
	'driver'   => 'mysql',
	'host'     => '127.0.0.1',
	'database' => 'database',
	'username' => 'root',
	'password' => '',
	'charset'  => 'utf8',
	'prefix'   => '',
),

さっそくコントローラからデータベースにアクセスしてみます
アクセスの方法は大きく3つあります

  • クエリー(生のSQL

SQLを書きます

  • Fluentクエリービルダー

テーブルやカラムを文字列として指定できる柔軟なアクセス

  • Eloquent ORM

テーブルとModelをマッピングしてオブジェクト操作

まずは、クエリーによるアクセスをしてみます
テーブルも空ですので、INSERTとSELECTをやってみます

user.php

<?php
Class User_Controller extends Base_Controller{
	public function action_index() {
		$binds = array('テスト', 'pass');
		$success = DB::query('insert into users (name,passwd) values (?, ?)', $binds);

		$users = DB::query('select * from users');
		echo var_dump($users);
	}
}
?>

ブラウザからアクセスするとINSERTされたレコードがSELECTされて表示されます

array(1) {
  [0]=>
  object(stdClass)#31 (8) {
    ["id"]=>
    int(1)
    ["name"]=>
    string(9) "テスト"
    ["passwd"]=>
    string(4) "pass"
    ["desc"]=>
    NULL
    ["auth"]=>
    NULL
    ["delete_flg"]=>
    int(0)
    ["updated_at"]=>
    string(19) "0000-00-00 00:00:00"
    ["created_at"]=>
    string(19) "2013-05-24 17:08:57"
  }
}

selectやinsertのSQLを発行するためにDB:query()メソッドを使用しました
この他にも結果の先頭レコードのみを取得する DB:first() メソッドや
カラムをひとつ指定して取り出す DB:only()メソッド があります

$user = DB::first('select * from users where id = 1');
$email = DB::only('select email from users where id = 1');

「表示結果」
object(stdClass)#31 (8) {
  ["id"]=>
  int(1)
  ["name"]=>
  string(9) "テスト"
  ["passwd"]=>
  string(4) "pass"
  ["desc"]=>
  NULL
  ["auth"]=>
  NULL
  ["delete_flg"]=>
  int(0)
  ["updated_at"]=>
  string(19) "0000-00-00 00:00:00"
  ["created_at"]=>
  string(19) "2013-05-24 17:08:57"
}
string(9) "テスト"