postした数値をController側でうまく拾うことができません。

88 views
Skip to first unread message

久保田真生

unread,
Feb 10, 2016, 10:28:02 AM2/10/16
to fuelphp.jp
fuelphp初学者です。

Model_Userという親クラスとModel_Test(プロパティは a と b)という子クラスがあったとして、これが1対多の関係で

View側から
<?php echo Form::input('test[a][0]', Input::post('test.a'), array('class' => 'test', 'placeholder'=>'Test')); ?>
<?php echo Form::input('test[a][1]', Input::post('test.a'), array('class' => 'test', 'placeholder'=>'Test')); ?>
<?php echo Form::input('test[b][0]', Input::post('test.b'), array('class' => 'test', 'placeholder'=>'Test')); ?>
<?php echo Form::input('test[b][1]', Input::post('test.a'), array('class' => 'test', 'placeholder'=>'Test')); ?>

として4つの入力値を取得するとき、

Controller側で

$post = Input::post();
$users = Model_User::forge($post);
$users -> test[] = Model_Test::forge($post['test']['a'][0]);
$users -> test[] = Model_Test::forge($post['test']['a'][1]);
$users -> test[] = Model_Test::forge($post['test']['b'][0]);
$users -> test[] = Model_Test::forge($post['test']['b'][1]);
$users -> save();

のようにして、Testテーブルに以下のように登録したいのですが、postした数値をController側でうまく拾うことができません。
+------------+--------------+----------------+
 |     id     |       a       |       b        |
+------------+--------------+----------------+
 |      1     |      [0]      |      [0]       |
+------------+--------------+----------------+
 |      2     |      [1]      |      [1]       |
+------------+--------------+----------------+

初歩的な質問かもしれませんが、この場合Controller側ではどのようなpostの拾い方ができるでしょうか。
どなたかご教授いただけないでしょうか。よろしくお願いいたします。

kit.t

unread,
Feb 11, 2016, 9:00:46 PM2/11/16
to fuelphp.jp
kittです。

Controller側で
$post = Input::post();
$users = Model_User::forge($post);
$users -> test[] = Model_Test::forge($post['test']['a'][0]);
$users -> test[] = Model_Test::forge($post['test']['a'][1]);
$users -> test[] = Model_Test::forge($post['test']['b'][0]);
$users -> test[] = Model_Test::forge($post['test']['b'][1]);
$users -> save();
のようにして、Testテーブルに以下のように登録したいのですが、postした数値をController側でうまく拾うことができません。

PHPのPOSTの取得は$_POSTではないでしょうか? 

下記のプログラム中でも使用されていますが、Input::post('test.a')が標準の取得方法となります。

久保田真生

unread,
Feb 12, 2016, 3:11:23 AM2/12/16
to fuelphp.jp
できました!ご回答ありがとうございます!

ちなみに、

$users -> test[] = Model_Test::forge($post['test']['a'][0]);
$users -> test[] = Model_Test::forge($post['test']['a'][1]);
$users -> test[] = Model_Test::forge($post['test']['b'][0]);
$users -> test[] = Model_Test::forge($post['test']['b'][1]);

の部分をforeachで回して入れようとした場合、Input::post('test.a')みたいな感じで、
$tests = Input::post();
foreach($tests as $i){
$test_a = Input::post('test.a.$i');←※
$test_b = Input::post('test.b.$i');←※
$request->test[] = Model_Test::forge(array('a' => $test_a, 'b' => $test_b));
}
のようにしてみたのですが、$iが1と0をもって来ることができなかったです。この場合は(※の部分は)どのように指定したら
よろしいのでしょうか。度々の初歩的な質問かもしれませんが、よろしくお願いいたします。

2016年2月12日金曜日 11時00分46秒 UTC+9 kit.t:

kit.t

unread,
Feb 12, 2016, 3:43:40 AM2/12/16
to fuelphp.jp
kittです。

文字列をシングルクオテーションにしているため、変数展開がされていないと思われます。

$test_a = Input::post('test.a.$i');←※
$test_b = Input::post('test.b.$i');←※
 
$_POST['test']['a']['$i']を呼び出しています。

$test_a = Input::post("test.a.$i");
のようにダブルクオテーションの場合に$iが展開されます。

久保田真生

unread,
Feb 12, 2016, 4:22:38 AM2/12/16
to fuelphp.jp
度々のご回答申し訳ございません。下記のようにダブルクオテーションでやってみたのですが、
Array to string conversion
のようなエラーが出てしまったのですが、
調べたところ配列として取得しようとしているようなのです。。
$iではなく普通の数字を入れると普通にできるのですが、不思議です。
お手間でなければご回答いただけると嬉しいです。
初歩的な質問で本当に申し訳ございません。

2016年2月12日金曜日 17時43分40秒 UTC+9 kit.t:

kit.t

unread,
Feb 12, 2016, 5:58:51 AM2/12/16
to fuelphp.jp
kittです。

よくよく見ればこのコードでは$i 自体に配列が入りますね。

$tests = Input::post();
で取得する内容はPOSTされた値全体のため、以下のような状態です。
$tests = array(
'test'=> array(
'a' => array(0 => ..., 1 =>...),
'b' => array(0 => ..., 1 =>...),
 )
)

つまり、以下で取得される$i は配列です。 
foreach($tests as $i){

print_r や var_dump でInput::post(); の値を確認すると分かりやすいかと思います。



すいません、最初の内容で誤読していた部分がありました。

Model_Userが1対多でModel_Testを持つのなら、
Model_Testがフィールドa、b、親テーブルへuser_idを持ち、

Viewでは
<?php echo Form::input('test[0][a]', Input::post('test.0.a'), array('class' => 'test', 'placeholder'=>'Test')); ?>
<?php echo Form::input('test[0][b]', Input::post('test.0.b'), array('class' => 'test', 'placeholder'=>'Test')); ?>
<?php echo Form::input('test[1][a]', Input::post('test.1.a'), array('class' => 'test', 'placeholder'=>'Test')); ?>
<?php echo Form::input('test[1][b]', Input::post('test.1.b'), array('class' => 'test', 'placeholder'=>'Test')); ?>

Controllerでは
$users = Model_User::forge();
foreach(Input::post('test') as $i){
$request->test[] = Model_Test::forge($i)->save();
}
$users->save();

のようになるのが適切なように思います。

久保田真生

unread,
Feb 12, 2016, 10:11:44 PM2/12/16
to fuelphp.jp
kittさん
下記のコードのおかげで、今やっとしっくりくるものができました!!
丁寧にアドバイスしていただき本当にありがとうございました。
助かりました!

2016年2月12日金曜日 19時58分51秒 UTC+9 kit.t:
Reply all
Reply to author
Forward
0 new messages