いろいろ~備忘録~

WEBエンジニアによる記録

勉強になったことを記録

【FuelPHP】Ormでリレーション設定をした表からデータ取得

Ormモデルでリレーションの設定ができていない場合は、下記の記事を参考にしてみて下さい。
wakuwakupush.hatenablog.com

1.データを取得

Ormモデルでリレーション設定をした表をfind()メソッドを利用して、データを取得します。
コントローラー上で、次のように記述します。

<?php

 // 全件取得
  $data = Model_Shop_data::find('all', array(
    'related' => array(
      'shop_photos', // リレーションの設定名を指定
    ),
  ));

結果は、2テーブルからデータを取得します。返り値はオブジェクト形式です。

詳しくはリファレンス
はじめに - Relations - Orm パッケージ - FuelPHP ドキュメント

【FuelPHP】Ormモデルのリレーションを設定

Ormパッケージを利用する場合は、先にOrmパッケージの設定を行って下さい。
wakuwakupush.hatenablog.com

FuelPHPでは、リレーションタイプが4種類あります。
・Belongs To
・Has One
・Has Many
・Many to Many

今回は、「Belongs To」と「Has Many」のみを利用します。

参考
はじめに - Relations - Orm パッケージ - FuelPHP ドキュメント

1.Ormモデルとテーブルの用意

今回はoilコマンドを利用して、「users」「phones」のOrmモデル、テーブルを自動生成します。

wakuwakupush.hatenablog.com

コマンドライン上で、次のコマンドを入力します。

$ php oil g model users name:varchar[50]
$ php oil g model phones user_id:int number:varchar[20]

「users」「phones」のモデル、マイグレーションが自動生成されます。
 
次はテーブルを生成します。次のコマンドを入力します。

$ php oil refine migrate

DBにテーブルが作成されていればOKです。

2.レコードの作成

レコードを作成するときは、下記のようにコントローラー内で入力します・

<?php

  // インスタンス
  $user = Model_User::forge();

  // プロパティに値を代入
  $user->name = 'karesansui';

  // DBにinsert
  $user->save();

コントローラにアクセスすると、usersテーブルへの挿入が行われています。

3.リレーションの設定

モデル間の関連性の記述をしていきます。
APPPATH/classes/model/user.php 内でリレーションを設定します。

<?php

  class Model_User extends \Orm\Model
  {
    protected static $_has_many = array(
      'phones' => array(
        'model_to'       => 'Model_Phone',
        'key_from'       => 'id',
        'key_to'         => 'user_id',
        'cascade_save'   => 'true',
        'cascade_delete' => 'true',
    )
  );

次にAPPPATH/classes/model/phone.php 内でリレーションを設定します。

<?php

  class Model_Phone extends \Orm\Model
  {
    protected static $_belongs_to = array(
      'users' => array(
        'model_to'       => 'Model_User',
        'key_from'       => 'user_id',
        'key_to'         => 'id',
        'cascade_save'   => 'true',
        'cascade_delete' => 'false',
    )
  );

リレーションの設定が完了したら、下記のようにコントローラーに記載します。

<?php

  $user = Model_User::find(1);
  $phone = Model_Phone::forge();
  $phone->number = '090-1111-2222';
  $user->phone[] = $phone;
  $user->save();

コントローラにアクセスして、SQLを確認してみると、usersテーブルの更新とphonesテーブルへの挿入が行われています。

下記詳細
はじめに - Relations - Orm パッケージ - FuelPHP ドキュメント

【FuelPHP】Ormパッケージを有効にする設定

Ormとは

データーベースのテーブルレコードとオブジェクトのマッピングや、テーブル間のリレーションを操作するためのパッケージです。Ormに含まれるModelクラスでは、基本的なCRUD用のメソッドも用意されています。

Ormの設定

Ormパッケージを利用するためには、下記ファイルの設定を有効にします。

// app/config/config.php

'always_load' => array(
    'packages' => array(
        'orm',
    ),
),

これでOrmの利用が可能になります。

【FuelPHP】oilコマンドを利用したOrmモデルの自動生成

説明

oilコマンドを利用して、Ormモデルマイグレーションを作成します。
また、テーブルの作成もoilコマンドで自動でします。

引用
oilコマンドでテーブルの作成するメリットは、データベースの構造もバージョン管理できるようになること

1.oilコマンドのインストール

oilコマンドを利用するためには、下記のコマンドでインストールをします。

$ curl get.fuelphp.com/oil | sh

詳しくはドキュメント
インストール方法 - インストール - FuelPHP ドキュメント

2.モデルの生成

コマンドラインFuelPHPをインストールしたディレクトリに移動して、次のコマンドを入力します。

$ php oil g model user id:int name:varchar[50]


下記のようにコマンドの応答を見ると、
1行目は、APPPATH/classes/model/直下にsudentというモデルが作成されています。
2行目は、APPPATH/migrations/というディレクトリ以下にマイグレーションが作成されています。

 Creating model: /home/apache/sample/fuel/app/classes/model/user.php
 Creating migration: /home/apache/sample/fuel/app/migrations/001_create_user

マイグレーションはテーブル作成時に、使用します。
Generate - Oil パッケージ - FuelPHP ドキュメント

3.テーブル作成

先ほど作成したマイグレーションを使用して、テーブルを作成します。
次のコマンドを入力します。

$ php oil refine migrate

db.phpで設定されているデータベース上にuserテーブルmigrationという2つのテーブルが作成されています。

マイグレーションファイルとモデルの中身を確認します。

<?php
// マイグレーション
namespace Fuel\Migrations;

class Create_users
{
	public function up()
	{
		\DBUtil::create_table('users', array(
			'id' => array('constraint' => 11, 'type' => 'int'),
			'name' => array('constraint' => 50, 'type' => 'varchar'),
			'created_at' => array('constraint' => 11, 'type' => 'int', 'null' => true),
			'updated_at' => array('constraint' => 11, 'type' => 'int', 'null' => true),

		), array('id'));
	}

	public function down()
	{
		\DBUtil::drop_table('users');
	}
}

<?php
// モデル
class Model_User extends \Orm\Model
{
	protected static $_properties = array(
		
		'id',
		'name',
		'created_at',
		'updated_at',
	);

	protected static $_observers = array(
		'Orm\Observer_CreatedAt' => array(
			'events' => array('before_insert'),
			'mysql_timestamp' => false,
		),
		'Orm\Observer_UpdatedAt' => array(
			'events' => array('before_update'),
			'mysql_timestamp' => false,
		),
	);

	protected static $_table_name = --crud<'users';

}

備考

Model_Crudモデルの自動生成
oil g modelコマンドのオプションとして、末尾に--crudを追加することにより、
\Orm\Modelではなく、Model_Crudを拡張したモデルを自動生成することができます。
Model_Crudクラスでも、\Orm\Modelと同様にcreated_atupdated_atが使用できます。
 
 
お疲れ様でした。

【FuelPHP】DBの結果を配列で取得

例えば下記のようにクエリを実行します。
結果はオブジェクトを生成します。

<?php
// オブジェクトを生成
$result = DB::select()
 ->from('users')
 ->where('id', 1)
 ->execute();


結果を配列で返して欲しい場合は、下記のようにexecute()の後にas_array()をくっつければ、
配列を生成します。

<?php
// 配列を生成
$result = DB::select()
 ->from('users')
 ->where('id', 1)
 ->execute()
 ->as_array();