質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ORM

ORM(オブジェクト関係マッピング)はオブジェクト指向のシステムとリレーショナルデータベースの間でマッピングを行う技術です。

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

Q&A

2回答

7449閲覧

[FuelPHP] [ORM] 取得したDB情報から特定のカラムのみ取得したい

star24star

総合スコア115

ORM

ORM(オブジェクト関係マッピング)はオブジェクト指向のシステムとリレーショナルデータベースの間でマッピングを行う技術です。

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

0グッド

0クリップ

投稿2016/02/18 04:23

編集2016/02/18 08:26

[やりたいこと]
・(取得したメッセージログをviewで表示するために)
test_tableというテーブルから取得した全てのデータからmessageのみを取り出したい

[実行]

PHP

1 2 // テーブル情報 3 protected static $_table_name = 'test_tab'; 4 protected static $_properties = [ 5 'id', 6 'message' 7 ]; 8 public function message_log() 9 { 10 // テーブル情報をすべて取得 11 $message_log = $this->find('all'); 12 13 // ここで出力したいデータの加工をする 14 // 下記のやり方だと一番最後のレコードしか取得できない 15 // foreach($test_table as $me) 16 // { 17 // $message = $me['message']; 18 // } 19 // $datas = array 20 // ( 21 // 'message' => $message, 22 // ); 23 24 return $message_log; 25 26 } 27 28

[実行結果]
print_r(message_log);

Array ( [1] => Orm_message Object ( [_is_new:protected] => [_frozen:protected] => [_data:protected] => Array ( [id] => 1 [message] => message001 ) [_custom_data:protected] => Array ( ) [_original:protected] => Array ( [id] => 1 [message] => message001 ) [_data_relations:protected] => Array ( ) [_original_relations:protected] => Array ( ) [_reset_relations:protected] => Array ( ) [_view:protected] => [_iterable:protected] => Array ( ) ) [2] => Orm_message Object ( [_is_new:protected] => [_frozen:protected] => [_data:protected] => Array ( [id] => 2 [message] => message002 ) [_custom_data:protected] => Array ( ) [_original:protected] => Array ( [id] => 2 [message] => message002 ) [_data_relations:protected] => Array ( ) [_original_relations:protected] => Array ( ) [_reset_relations:protected] => Array ( ) [_view:protected] => [_iterable:protected] => Array ( ) ) [3] => Orm_message Object ( [_is_new:protected] => [_frozen:protected] => [_data:protected] => Array ( [id] => 3 [message] => message003 ) [_custom_data:protected] => Array ( ) [_original:protected] => Array ( [id] => 3 [message] => message003 ) [_data_relations:protected] => Array ( ) [_original_relations:protected] => Array ( ) [_reset_relations:protected] => Array ( ) [_view:protected] => [_iterable:protected] => Array ( ) ) )

要はSELECT message FROM test_table;と同じ結果です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

php

1// foreach($test_table as $me) 2// { 3// $message = $me['message']; 4// } 5// $datas = array 6// ( 7// 'message' => $message, 8// );

質問に書いてあるコメント部分のコードですが、
下のようにしないといけない気が。。。

php

1$datas = array(); 2foreach($test_table as $me) 3{ 4 $datas[] = $me['message']; 5}

message列のみを取得したいとのことですが、
idがついているとだめな理由は何ですか?
idが取得されていたとしても、使わなければいいだけだと思います。

投稿2016/02/18 13:32

toru81

総合スコア170

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

star24star

2016/02/19 00:37

質問では省いたのですが、idとmessage以外にもカラムがいくつかある為、必要なものだけ取得するよう考えました。 また、全取得後、配列にインデックス指定で格納する方法が分からなかったからです。 $test_table = $this->find('all'); $datas = array( 'message' => $test_table->message ); --->> Trying to get property of non-object $test_table = $this->find('all'); $datas = array( 'message' => $log['message'] ); --->> Undefined index: message
star24star

2016/02/19 00:49

ご教示頂いた方法で下記が取得できました ーーー Array ( [0] => message001 [1] => message002 [2] => message003 [3] => message004 [4] => message005 ) ーーー これをViewで使用するために ーーー $datas = array( 'message' => $message ); ーーー return View::forge('chat/index', $datas ); --- とすると、returnの前までは一件しか取得できず、 viewでもecho $messageとすると一件しか表示されません。 なにかいい方法はありますでしょうか…?
toru81

2016/02/19 13:09

こんな感じでしょうか? $messages = array(); foreach($test_table as $me) { $messages[] = $me['message']; } $datas = array( 'message' => $messages ); return View::forge('chat/index', $datas );
guest

0

カラムを指定して部分的に取得
http://fuelphp.jp/docs/1.6/packages/orm/crud.html#/partial_selects

にあるように、find()メソッド内第2パラメータにselectを与えれば良さそうです。

投稿2016/02/18 06:15

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

star24star

2016/02/18 07:12

$test_table = $this->find(last, array('select' => array('message'))); だと一件しかとれなく、allやfirstでも理想の結果だとれないのです。。。
退会済みユーザー

退会済みユーザー

2016/02/18 08:01

$this->find('all', array('select' => array('message'))); でもダメなんでしょうか。 http://fuelphp.jp/docs/1.8/packages/orm/crud.html ページ後半にある「find を使用するときの全ての選択メソッド」あたりもご参照ください。 $this->query()->select('id', 'name'); も同様でしょうか。
star24star

2016/02/18 08:24

$this->find('all', array('select' => array('message')));もだめでした。 質問内に書いた実行結果と同じ(全て)結果が取得されます。 $this->query()->select('message'); もデータ取得できませんでした。 $message_log = DB::select('message')->from('test_table')->as_assoc()->execute(); return $message_log->as_array(); だと、 ``` Array ( [0] => Array ( [message] => message001 ) [1] => Array ( [message] => message002 ) [2] => Array ( [message] => message003 ) [3] => Array ( [message] => message004 ) [4] => Array ( [message] => message005 ) ) ``` が取得出来るのですが、これはormのやり方なのでしょうか…?? 上でテーブル名を指定しているのに再びテーブル名をしているあたり、ちょっと違うのかなと思ったのですが…
退会済みユーザー

退会済みユーザー

2016/02/18 08:49 編集

ORMモデルはいじってなくてノウハウ不足で申し訳ありません。 Arr::assoc_to_keyval() を使うと楽です。 [FuelPHP] DBクラスの結果を1次元連想配列に変換する方法 – 零弐壱蜂 http://b.0218.jp/20141028155824.html もしくは、as_array('message') とか。
star24star

2016/02/18 09:03 編集

使いこなすのが難しいですね… こんな結果が取得できました $message_log = DB::select('message')->from('test_table')->execute()->as_array('message'); --- Array ( [message001] => Array ( [message] => message001 ) [message002] => Array ( [message] => message002 ) [message003] => Array ( [message] => message003 ) )
退会済みユーザー

退会済みユーザー

2016/02/18 10:00

$message_log = DB::select('message')->from('test_table')->as_assoc()->execute()->as_array('message'); かも。
star24star

2016/02/18 10:11

試してみました! 上記と同じような結果が取得できます。。。
退会済みユーザー

退会済みユーザー

2016/02/18 11:47

Arr::assoc_to_keyval() ははまらないでしょうか?
star24star

2016/02/19 00:57 編集

assoc_to_keyvalwoを使用してみたのですが、第二引数と第三引数の必須のようです。 第二と第三をmessageにしてしまうと[カラム名=>カラム内のデータ]ではなく、 [カラム内のデータ=>カラム内のデータ]になってしまいます。 --- [message001] => message001 [message002] => message002 ---
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問