列名として22番のテーブルを作成します。この列にアクセスする方法は?
コンテンツ:
私が試した
$obj = Tablename::find(1)->first();
$obj->22;
$obj->'22'; //'syntax error, unexpected ''22''
$obj->"22";
$obj->`22`;
$obj[22];
$arr = $obj->toArray();
var_dump($arr); // array(15) { ["id"]=> string(2) "25" ["out_trade_no"]=> string(14) "14847080930025" ["22"]=> string(0) "2"
$arr[22]; // 'ErrorException' with message 'Undefined offset: 22'
$arr['22']; // 'ErrorException' with message 'Undefined offset: 22'
$arr["22"]; // 'ErrorException' with message 'Undefined offset: 22'
$arr[`22`]; // 'ErrorException' with message 'Undefined index: ' in
$arr[{'22'}]; // 'syntax error, unexpected '{', expecting ']'' in
どれも動作しません。
実装された回答として編集:nullも取得。
var_dump($orders[0]);
var_dump($orders[0]->id);
var_dump($orders[0]->{'22'});
$col = '22';
$res = $orders[0]->{$col};
var_dump($res);
出力:
object(Order)#537(21){
[
"connection": protected
]=>NULL[
"table": protected
]=>NULL[
"primaryKey": protected
]=>string(2)"id"[
"perPage": protected
]=>int(15)[
"incrementing"
]=>bool(true)[
"timestamps"
]=>bool(true)[
"attributes": protected
]=>array(15){
[
"id"
]=>string(2)"25"[
"out_trade_no"
]=>string(14)"14847080930025"[
"22"
]=>string(1)"2"[
"user_id"
]=>string(2)"49"[
"product_name"
]=>string(4)"test"[
"amount"
]=>string(1)"3"[
"fee"
]=>string(4)"0.03"[
"address_id"
]=>string(1)"3"[
"trade_status"
]=>string(13)"TRADE_SUCCESS"[
"express_name"
]=>string(0)""[
"express_no"
]=>string(0)""[
"buyer_email"
]=>string(0)""[
"modify_at"
]=>string(19)"2017-01-18 10:54:53"[
"created_at"
]=>string(19)"2017-01-18 10:54:53"[
"updated_at"
]=>string(19)"2017-01-18 10:55:26"
}[
"original": protected
]=>array(15){
[
"id"
]=>string(2)"25"[
"out_trade_no"
]=>string(14)"14847080930025"[
"22"
]=>string(1)"2"[
"user_id"
]=>string(2)"49"[
"product_name"
]=>string(4)"test"[
"amount"
]=>string(1)"3"[
"fee"
]=>string(4)"0.03"[
"address_id"
]=>string(1)"3"[
"trade_status"
]=>string(13)"TRADE_SUCCESS"[
"express_name"
]=>string(0)""[
"express_no"
]=>string(0)""[
"buyer_email"
]=>string(0)""[
"modify_at"
]=>string(19)"2017-01-18 10:54:53"[
"created_at"
]=>string(19)"2017-01-18 10:54:53"[
"updated_at"
]=>string(19)"2017-01-18 10:55:26"
}[
"relations": protected
]=>array(0){
}[
"hidden": protected
]=>array(0){
}[
"visible": protected
]=>array(0){
}[
"appends": protected
]=>array(0){
}[
"fillable": protected
]=>array(0){
}[
"guarded": protected
]=>array(1){
[
0
]=>string(1)"*"
}[
"dates": protected
]=>array(0){
}[
"touches": protected
]=>array(0){
}[
"observables": protected
]=>array(0){
}[
"with": protected
]=>array(0){
}[
"morphClass": protected
]=>NULL[
"exists"
]=>bool(true)[
"softDelete": protected
]=>bool(false)
}string(2)"25"NULLNULL
編集: Parasのコメントによる
Edit2:質問を単純で明確にするために:
移行:
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class Test extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('tests', function($table)
{
$table->increments('id');
$table->integer('22');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
}
}
モデル:
<?php
class Test extends Eloquent
{
}
コントローラ:
public function show()
{
$tests = Test::all();
foreach($tests as $test)
{
Log::info($test->id);
Log::info($test->{'22'});
Log::info($test->{"22"});
Log::info($test->getAttribute("22"));
}
}
データ表:
そしてログ:
[2017-02-25 09:16:48] production.INFO: 1 [] []
[2017-02-25 09:16:48] production.INFO: [] []
[2017-02-25 09:16:48] production.INFO: [] []
[2017-02-25 09:16:48] production.INFO: [] []
[2017-02-25 09:16:48] production.INFO: 2 [] []
[2017-02-25 09:16:48] production.INFO: [] []
[2017-02-25 09:16:48] production.INFO: [] []
[2017-02-25 09:16:48] production.INFO: [] []
最善の方法は、整数をフィールド名として使用しないことです。それは悪い実践です。ただし、必要に応じて、rawメソッドでデータベースにアクセスする必要があります。
public function show()
{
$tests = DB::table('test')
->select("22 as twentytwo")
->get();
foreach($tests as $test){
Log::info($test->twentytwo);
}
}
PHPのドキュメントの 変数変数のトピック にあるように、次の構文を使用できます。
$obj->{'22'};
...
プロパティ名を明確に区切るために、中かっこも使用できます。これらは、配列を含むプロパティ内の値にアクセスする場合、プロパティ名が複数の部分で構成される場合、またはプロパティ名に他の方法では無効な文字が含まれる場合(たとえば、json_decode()またはSimpleXMLから)。
これを試して:
$obj->getAttributeValue("22");
動作しない場合はエラーを投稿してください
名前が常に22であることがわかっている場合は、これを行うことができます。
$myfield = 22;
dd($obj->$myfield);
私はそれをテストし、それは22フィールドの値を正しく返します。
これを試して:
$col = '22';
$res = $obj->{$col};
var_dump($res);
モデル属性$ mapsを使用して、問題のある列に別の名前を付けることができます。試す
$maps = ['22' => 'twentytwo'];
$hidden = ['22'];
$appends = ['twentytwo'];
次に、モデルインスタンスで
echo $model->twentytwo;
質問はこれに似ています:
LaravelのEloquentモデルの数値フィールドを非表示
現在、これはvendor\symfony\var-dumper\Symfony\Component\VarDumper\Cloner\VarCloner.php at line 74
にあるこのコード行に見られるように、Laravelでは不可能です。
if ($zval['zval_isref'] = $queue[$i][$k] === $cookie) {
$zval['zval_hash'] = $v instanceof Stub ? spl_object_hash($v) : null;
}
これがハックです。
if ($zval['zval_isref'] = (isset($queue[$i][$k])) ? ($queue[$i][$k] === $cookie) : false) {
$zval['zval_hash'] = $v instanceof Stub ? spl_object_hash($v) : null;
}
問題はここで議論されました:
$arr= Tablename::where('id', 1)->lists('22', 'id')->toArray();
$result = $arr[1];
As 1 is the $id var. I tried it in my localhost and it works
どこで使うか:Tablename::where('22','=','value')->first();
laravel model の存在する列をどのように使用できますか?
ここでも同じ答えが当てはまります。 $model->getAttribute('22')
を使用して、モデル属性の値を取得できます。
$table = Tablename::get();
foreach ($table as $value){
echo $value->22 // Getting column 22 from table
}
使用してみてください pluck()
$plucked = $collection->pluck('22');
$plucked->all();