CodeIgniter JOINを使うデータ取得 サンプルコードあり

PHP

CodeIgniter JOINを使うデータ取得 サンプルコード

ちょっと直感的にわかりにくかったので、メモしておきます。

次のような2つのテーブルがあります。
ユーザーと、ユーザーの友達のテーブルです。

users

|id|name|email|
|1|エレン|elen@onlineconsultant.jp|
|2|アルミン|almin@onlineconsultant.jp|

friends

|id|user_id|name|birthday|
|1|1|ミカサ|1月4日|
|2|1|リヴァイ|2月15日|
|3|2|ベルナルド|4月30日|

1月4日の友達を検索して、誰の友達なのかと、友達の誕生日と、友達の名前を表示します。

 $this->load->database();
 $where = array('friends.birthday' => "1月4日");
 $this->db->select('friends.birthday, friends.name as friend_name, users.name as user_name, users.email');
 $this->db->from('friends');
 $this->db->join('users', 'users.id = friends.user_id');
 $this->db->where($where);
 $query = $this->db->get();
 
  foreach($query->result() as $row){
     $friend_name = $row->friend_name; //ミカサが入ります
     $user_name = $row->user_name; //エレンが入ります
  }				

発行されるSQL文は次のようになります。

 SELECT 
    `friends`.`birthday`, `friends`.`name` as friend_name, `users`.`name` as user_name, `users`.`email`
 FROM (`friends`)
 JOIN `users` ON `users`.`id` = `friends`.`user_id`
 WHERE `friends`.`birthday` =  '1月4日'  

CodeIgniter GROUP_CONCATを使う

CodeIgniter GROUP BYを使う
PHP

CodeIgniter GROUP_CONCATを使う

CodeIgniterでGROUP_CONCATを使うには、$this->db->selectの中で使います。

 $this->db->select('friends.birthday, 
                GROUP_CONCAT(friends.name SEPARATOR ",") as friend_name',
 false);

$this->db->select()の第二引数がfalseでないと、シンタックスエラーになってしまいます。
忘れがちなので、注意してみてください。

CodeIgniter GROUP BYを使う

PHP

CodeIgniter GROUP BYを使う

 $this->db->group_by('users.id');

というようにできます。

CodeIgniter GROUP_CONCATを使う

CodeIgniter

CodeIgniterはPHPの軽量フレームワークです。
早い、かつお手軽。
大量のページを作る、などでなければ、おすすめです。

Cocoa CoreDataのEntitiyを変更した場合に自動マイグレーションをする

iPhone
Xcode

CoreDataのEntityを変更した場合、マイグレーション処理をしなければアプリケーションが落ちてしまいます。ここでは自動マイグレーションについて説明します。

1. 「設計 – データモデル – モデルバージョンを追加」
 [プロジェクト名].xcdatamodeld内に
  [プロジェクト名] 2.xcdatamodel が追加されます。

2. 新しくできたモデルに対して変更を行います。

3. 「新規ファイル – Resource – Mapping Model」を選びマッピングファイルを作成します。
 ここでは下記のようにします。
  モデル名:map_01_02.xcmappingmodel
  ソースモデル:[プロジェクト名].xcdatamodel
  デスティネーションモデル:[プロジェクト名] 2.xcdatamodel

4. 作成したマッピングファイルを開き、適宜変更箇所の調整をします。

5. AppDelegate.mにマイグレーション用のコードを追加します。
  - (NSPersistentStoreCoordinator *)persistentStoreCoordinatorを下記のように変更します。

    
    if (persistentStoreCoordinator_ != nil) {
        return persistentStoreCoordinator_;
    }
    
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"[ ファイル名 ].sqlite"];
    

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

    NSError *error = nil;
    persistentStoreCoordinator_ = NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel;
    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    
    
    return persistentStoreCoordinator_;

6. Xcodeで[プロジェクト名] 2.xcdatamodelを選択し
 「設計 – データモデル – 現在のバージョンを設定」を選択し、「ビルドと実行」でアプリケーションが落ちなければ完了です。