Saturday, February 25, 2017

laravel how to access column with number name of a table?

Leave a Comment

I make a table with number 22 as the column name. How to access this column?

enter image description here

content:

enter image description here

I've tryed thest

$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 

none works.

edited as the answer implemented: also get null.

var_dump($orders[0]); var_dump($orders[0]->id); var_dump($orders[0]->{'22'}); $col = '22'; $res = $orders[0]->{$col}; var_dump($res); 

output:

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 

Edit: acording to Paras's comment

enter image description here

Edit2: to make question simple and clear:

migration:

<?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()     {         //     }  } 

Model:

<?php class Test extends Eloquent { } 

Controller:

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"));     } } 

data table:

enter image description here

and the log:

[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:  [] [] 

12 Answers

Answers 1

You can use the following syntax, as found in the variable variables topic in the PHP documentation:

$obj->{'22'}; 

...

Curly braces may also be used, to clearly delimit the property name. They are most useful when accessing values within a property that contains an array, when the property name is made of mulitple parts, or when the property name contains characters that are not otherwise valid (e.g. from json_decode() or SimpleXML).

Answers 2

Try this:

$obj->getAttributeValue("22"); 

Please post the error if it doesn't work

Answers 3

Try this:

$col = '22'; $res = $obj->{$col}; var_dump($res); 

Answers 4

You can use model attribute $maps to give your troublesome column a different name. Try

$maps = ['22' => 'twentytwo'];  $hidden = ['22'];  $appends = ['twentytwo']; 

Then with your model instance

echo $model->twentytwo; 

Answers 5

$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 

Answers 6

Possible duplicate of how can I use exists column with laravel model

The same answer applies here; you can use $model->getAttribute('22') to get the value of a model attribute.

Answers 7

Try to use where: Tablename::where('22','=','value')->first();

Answers 8

$table = Tablename::get();  foreach ($table as $value){    echo $value->22 // Getting column 22 from table } 

Answers 9

The question is similar to this:

Hide number field from Eloquent model in Laravel

Presently this is not possible in Laravel as seen in this line of code located in vendor\symfony\var-dumper\Symfony\Component\VarDumper\Cloner\VarCloner.php at line 74.

if ($zval['zval_isref'] = $queue[$i][$k] === $cookie) {    $zval['zval_hash'] = $v instanceof Stub ? spl_object_hash($v) : null; } 

Here is the hack.

if ($zval['zval_isref'] = (isset($queue[$i][$k])) ? ($queue[$i][$k] === $cookie) : false) {    $zval['zval_hash'] = $v instanceof Stub ? spl_object_hash($v) : null; } 

Issue has been discussed here:

https://github.com/laravel/framework/issues/8710

Answers 10

if you always know the name is 22, you can do this.

 $myfield = 22;  dd($obj->$myfield); 

I tested it and it returns the value in the 22 field correctly.

Answers 11

Best way is NOT to use Integer as a fieldname. It is bad praxis. But if you need, you should access the database with raw method:

public function show() {      $test = DB::table('test')         ->select("22 as twentytwo")         ->get();     foreach($tests as $test)     {         Log::info($test->twentytwo);     } } 

Answers 12

Try use pluck()

$plucked = $collection->pluck('22');  $plucked->all(); 
If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment