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

【问题讨论】:

唯一没试过的:-&gt;'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-&gt;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')-&gt;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如何访问具有表编号名称的列?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel同时删除两个相关表

如何从其他表中获取所需的列

如何在pyspark中连接具有相同名称的列的值

Laravel 8 的嵌套关系访问

如何在MySQL中获取具有同一表计数的列

如何获得具有已知名称的列左侧的列名称?