为啥 eloquent orm 上的查询语句结果返回空值

Posted

技术标签:

【中文标题】为啥 eloquent orm 上的查询语句结果返回空值【英文标题】:Why query statement results on eloquent orm is returning null values为什么 eloquent orm 上的查询语句结果返回空值 【发布时间】:2021-01-10 05:20:05 【问题描述】:

我是这个问题的新手,所以请多多包涵。

我使用 Eloquent 作为我的 php 数据库库。所以我创建了一个从Illuminate\Database\Eloquent\Model 扩展的类,并尝试查询一条记录。当我打印结果时,我知道它正在获取信息,正如您可以通过受保护的属性看到的那样,但不知何故,记录的公共属性为 NULL。

我错过了一些以前的配置,还是有其他原因?

这是我的结构:

模特,Plantilla.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Plantilla extends Model

    /**
     * @var string
     */
    protected $primaryKey = 'cod_plantilla';
    /**
     * @var string
     */
    protected $table = 'plantilla';
    protected $connection = 'mysql';

    public function __construct()
    
        #attributes
        parent::__construct();
        Database2::init();
    

Database.php

<?php

namespace App\Models;

use Illuminate\Database\Capsule\Manager as Capsule;

class Database2

    private static $db;

    static public function init()
    
        if (is_null(self::$db)) 
            $capsule = new Capsule;

            $capsule->addConnection([
                'driver' => 'mysql',
                'host' => getenv('DB_HOST'),
                'database' => getenv('DB_NAME'),
                'username' => getenv('DB_USER'),
                'password' => getenv('DB_PASS'),
                'charset' => 'utf8',
                'collation' => 'utf8_unicode_ci',
                'prefix' => '',
            ], 'mysql');

            // Make this Capsule instance available globally via static methods... (optional)
            $capsule->setAsGlobal();

            // Setup the Eloquent ORM... (optional; unless you've used setEventDispatcher())
            $capsule->bootEloquent();
        
    

index.php

$p = Plantilla::where('cod_plantilla', 35)->first();
var_dump($p);

结果

object(App\Models\Plantilla)[251]
  protected 'primaryKey' => string 'cod_plantilla' (length=13)
  protected 'table' => string 'plantilla' (length=9)
  protected 'connection' => string 'mysql' (length=5)

  # Values I need
  public 'cod_area_interna' => null
  public 'cod_tipo_plantilla' => null
  public 'nombre' => null
  public 'detalle' => null
  public 'personalizada' => null
  public 'fecha' => null
  # Values I need

  protected 'keyType' => string 'int' (length=3)
  public 'incrementing' => boolean true
  protected 'with' => 
    array (size=0)
      empty
  protected 'withCount' => 
    array (size=0)
      empty
  protected 'perPage' => int 15
  public 'exists' => boolean true
  public 'wasRecentlyCreated' => boolean false

  # Same values I need but they're protected
  protected 'attributes' => 
    array (size=7)
      'cod_plantilla' => int 35
      'cod_area_interna' => int 2
      'cod_tipo_plantilla' => int 1
      'nombre' => string 'Some' (length=32)
      'detalle' => string 'Some' (length=142)
      'personalizada' => null
      'fecha' => string '2020-06-25 12:15:13' (length=19)
  protected 'original' => 
    array (size=7)
      'cod_plantilla' => int 35
      'cod_area_interna' => int 2
      'cod_tipo_plantilla' => int 1
      'nombre' => string 'Some' (length=32)
      'detalle' => string 'Some' (length=142)
      'personalizada' => null
      'fecha' => string '2020-06-25 12:15:13' (length=19)
  protected 'changes' => 
...

如文档所述,您可以这样做

<?php

$flights = App\Models\Flight::all();

foreach ($flights as $flight) 
    echo $flight->name;

因此您可以访问属性,即表列值。

就我而言,这些是:

鳕鱼植物 cod_area_interna cod_tipo_plantilla 名词 详细介绍 个性化 fecha

【问题讨论】:

Welcome to SO ...没有“公共”属性,属性数组是“受保护的”...虽然有多种方法可以访问模型上的这些属性...你是什么现在真的在找吗? 我不明白你的问题实际上在问什么......你有一个模型实例,而不是null,它是表中记录的表示,字段是属性。 ..你不知道如何访问模型的属性? 我编辑了提示,这样会更清楚 【参考方案1】:

在我看来,Eloquent 的表现实际上完全符合其应有的水平!

Eloquent 使用 PHP 魔术方法做了很多自动魔术。 看起来类似于常规 PHP 对象属性的内容实际上是通过 $attribute 属性中的 __get()__set() 动态访问的。

在你的例子中你有这个:

$p = Plantilla::where('cod_plantilla', 35)->first();

使用 Tinker(如果您是 Laravel 的新手,使用php artisan tinker 来找出这类东西是最简单的),您应该可以尝试像这样访问您的数据库列:

> $p->cod_plantilla;
35
> $p->fecha;
'2020-06-25 12:15:13'

您应该会发现您的值已返回,即使 var_dump() 没有显示任何内容!

【讨论】:

【参考方案2】:

我不确定你在这里实际问的是什么。

属性不是类的“属性”。它们保存在名为$attributes 的受保护数组中。如果您想访问它们,可以按照文档说明的方式进行。

您可以通过动态属性访问它们:

$p = Plantilla::find(35);

echo $p->nombre;

通过数组访问:

echo $p['nombre'];

你可以自己获取属性数组:

dump($p->getAttributes());

将模型的属性(和加载的关系)序列化为数组:

dump($p->toArray());

或者甚至将序列化模型作为 JSON:

echo $p->toJson();

【讨论】:

感谢您的回答,使用 $p->nombre 返回 null 值,但如果我使用 $p['nombre'] 它返回预期值。你知道这是为什么吗?

以上是关于为啥 eloquent orm 上的查询语句结果返回空值的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent ORM - 选择所有两个关系都不存在的模型时,生成的 SQL 和查询构建器结果不匹配

Laravel Eloquent ORM - 获取第一和第三表数据

丰富 Eloquent ORM 的 where 查询条件的解析场景

如何在 eloquent ORM 中执行此搜索查询

laravel Eloquent ORM - 如何获得编译查询?

如何使用 Eloquent ORM 进行多重连接查询