web-dev-qa-db-fra.com

laravel comment accéder à la colonne avec le numéro de nom d'une table?

Je fais un tableau avec le numéro 22 comme nom de colonne. Comment accéder à cette colonne?

enter image description here

contenu:

enter image description here

J'ai essayé

$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

aucun ne fonctionne.

modifié comme la réponse implémentée: obtenez également null.

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

production:

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: selon commentaire de Paras

enter image description here

Edit2: pour rendre la question simple et claire:

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

}

Modèle:

<?php
class Test extends Eloquent
{
}

Manette:

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

tableau de données:

enter image description here

et le journal:

[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:  [] []
19
Kris Roofe

Le meilleur moyen n'est PAS d'utiliser Integer comme nom de champ. C'est une mauvaise pratique. Mais si vous en avez besoin, vous devez accéder à la base de données avec la méthode brute:

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

Vous pouvez utiliser la syntaxe suivante, telle que trouvée dans la rubrique variables variables dans la documentation PHP:

$obj->{'22'};

...

Des accolades peuvent également être utilisées , pour délimiter clairement le nom de la propriété. Ils sont particulièrement utiles lors de l'accès à des valeurs dans une propriété qui contient un tableau, lorsque le nom de la propriété est composé de plusieurs parties, ou lorsque le nom de la propriété contient des caractères qui ne sont pas autrement valides (par exemple à partir de json_decode () ou SimpleXML).

9
Marty

Essaye ça:

$obj->getAttributeValue("22");

Veuillez signaler l'erreur si cela ne fonctionne pas

4
Paras

si vous savez toujours que le nom est 22, vous pouvez le faire.

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

Je l'ai testé et il renvoie correctement la valeur dans le champ 22.

3
Onix

Essaye ça:

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

Vous pouvez utiliser l'attribut de modèle $ maps pour donner un nom différent à votre colonne problématique. Essayer

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

$hidden = ['22'];

$appends = ['twentytwo'];

Ensuite, avec votre instance de modèle

echo $model->twentytwo;
2
Jeremy Giberson

La question est similaire à ceci:

Masquer le champ numérique du modèle Eloquent dans Laravel

Actuellement, cela n'est pas possible dans Laravel comme on le voit dans cette ligne de code située dans 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;
}

Voici le 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;
}

La question a été discutée ici:

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

2
Angelin Calu
$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
2
Abdulkareem Mohammed

Essayez d'utiliser où: Tablename::where('22','=','value')->first();

1
iamj

Duplicata possible de comment utiliser la colonne existe avec laravel

La même réponse s'applique ici; vous pouvez utiliser $model->getAttribute('22') pour obtenir la valeur d'un attribut de modèle.

1
nvisser
$table = Tablename::get();

foreach ($table as $value){
   echo $value->22 // Getting column 22 from table
}
1
user4798623

Essayez d'utiliser pluck ()

$plucked = $collection->pluck('22');

$plucked->all();
0
nmtri