laravel如何访问具有表编号名称的列?
Posted
技术标签:
【中文标题】laravel如何访问具有表编号名称的列?【英文标题】:laravel how to access column with number name of a table? 【发布时间】:2017-06-02 08:41:45 【问题描述】:我制作了一个以数字 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
没有任何作用。
编辑为已实现的答案:也为空。
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's comment
编辑2: 使问题简单明了:
迁移:
<?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: [] []
【问题讨论】:
唯一没试过的:->'22'
@Marty 你能解释一下吗,这里有什么问题,或者我可以参考哪里?非常感谢。
有什么理由必须将其称为22
?最快的解决方法,也是最好的解决方案,就是将它重命名为一个字符串来表示它是什么
@WebKenth 我同意你的看法。当我无法修改数据库表时,我只是找到了一种替代方法。还是谢谢大家。
【参考方案1】:
试试这个:
$col = '22';
$res = $obj->$col;
var_dump($res);
【讨论】:
我试过了,没有得到。我已经编辑了问题中的输出【参考方案2】:您可以使用以下语法,如 PHP 文档中的 variable variables topic 所示:
$obj->'22';
...
也可以使用花括号,以明确界定属性名称。当访问包含数组的属性中的值时,当属性名称由多个部分组成时,或当属性名称包含无效的字符(例如,来自 json_decode()或 SimpleXML)。
【讨论】:
我试过了,没有得到。我已经编辑了问题中的输出【参考方案3】:试试这个:
$obj->getAttributeValue("22");
如果错误,请发布错误
【讨论】:
$pri = Cloud_printer::all(); foreach($pri as $v) Log::info($v->getAttributeValue("22"));生产。错误:异常 'BadMethodCallException' 带有消息'调用未定义的方法 Illuminate\Database\Query\Builder::getAttributeValue()' 这没有意义。getAttributeValue
是 Eloquent 模型的函数。你使用的是哪个版本的 Laravel?
你也可以发布dd($pri)
的输出吗?
检查问题
看起来 Cloud_Printer 不是 Eloquent 模型。它似乎是一个自定义类。请贴出这个类的代码【参考方案4】:
您可以使用模型属性 $maps 为麻烦的列指定不同的名称。试试
$maps = ['22' => 'twentytwo'];
$hidden = ['22'];
$appends = ['twentytwo'];
然后用你的模型实例
echo $model->twentytwo;
【讨论】:
【参考方案5】:how can I use exists column with laravel model 可能重复
同样的答案也适用于这里;您可以使用$model->getAttribute('22')
来获取模型属性的值。
【讨论】:
这里没有数字; 它只是得到空值,例如:[2017-02-23 19:30:28] production.INFO: [] [] [2017-02-23 19:30:28] production.信息:[] [] [2017-02-23 19:30:28] 生产。信息:[] [] [2017-02-23 19:30:28] 生产。信息:[] [] [2017-02 -23 19:30:28] 生产.INFO: [] [] [2017-02-23 19:30:28] 生产.INFO: [] []【参考方案6】:尝试使用 where:
Tablename::where('22','=','value')->first();
【讨论】:
【参考方案7】:$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
【讨论】:
【参考方案8】:$table = Tablename::get();
foreach ($table as $value)
echo $value->22 // Getting column 22 from table
【讨论】:
【参考方案9】:尝试使用pluck()
$plucked = $collection->pluck('22');
$plucked->all();
【讨论】:
【参考方案10】:问题类似这样:
Hide number field from Eloquent model in Laravel
目前这在 Laravel 中是不可能的,正如位于 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;
这是破解。
if ($zval['zval_isref'] = (isset($queue[$i][$k])) ? ($queue[$i][$k] === $cookie) : false)
$zval['zval_hash'] = $v instanceof Stub ? spl_object_hash($v) : null;
问题已在此处讨论:
https://github.com/laravel/framework/issues/8710
【讨论】:
【参考方案11】:如果你总是知道名字是 22,你可以这样做。
$myfield = 22;
dd($obj->$myfield);
我测试了它,它正确返回了 22 字段中的值。
【讨论】:
【参考方案12】:最好的方法是不要使用整数作为字段名。这是不好的做法。 但是如果你需要,你应该使用 raw 方法访问数据库:
public function show()
$tests = DB::table('test')
->select("22 as twentytwo")
->get();
foreach($tests as $test)
Log::info($test->twentytwo);
【讨论】:
就像一个魅力,它的工作原理。稍后你的答案,但做的伎俩。谢谢。 那不是原始方法,原始方法使用DB::raw()
【参考方案13】:
我知道这是多年前的一个问题,但希望有人觉得这有帮助,如果您将数据库表列名称设置为“数字”或整数,您可以像这样获取它的数据;
在您的控制器示例中:
$your-table = users::all(); //或者使用find等..
//然后循环
foreach ($your-table as $key)
返回 $key['1']; //['1'] 是我设置为整数的 db 列名
【讨论】:
以上是关于laravel如何访问具有表编号名称的列?的主要内容,如果未能解决你的问题,请参考以下文章