HasOne 显示“null”或“未定义属性:Illuminate\\Database\\Eloquent\\Relations\\HasOne”

Posted

技术标签:

【中文标题】HasOne 显示“null”或“未定义属性:Illuminate\\\\Database\\\\Eloquent\\\\Relations\\\\HasOne”【英文标题】:HasOne showing either "null" or "Undefined property: Illuminate\\Database\\Eloquent\\Relations\\HasOne"HasOne 显示“null”或“未定义属性:Illuminate\\Database\\Eloquent\\Relations\\HasOne” 【发布时间】:2021-11-25 12:27:16 【问题描述】:

我正在尝试使用 hasOne 在我的数据集中返回单个值,但是如果不返回完整对象,我似乎无法将单个列作为值返回。

当你只返回hasOne时,返回的对象是什么样子的:

protected $with = ["steps"];

public function steps() 
    return $this->hasOne("App\Compares\ComparesSteps", "compare_id", "id");

只使用 hasOne 作为默认对象的结果:

array:21 [
  "id" => 5887894545
  "steps" => array:5 [
    "id" => 21
    "compare_id" => 588789
    "steps" => array:12 [
      0 => 1
      1 => 2
      2 => 3
      3 => 4
      4 => 13
      5 => 6
      6 => 7
      7 => 17
      8 => 8
      9 => 9
      10 => 10
      11 => 12
    ]
    "created_at" => "2021-10-05 08:48:44"
    "updated_at" => "2021-10-05 08:48:44"
  ]
  "created_at" => "2021-10-05 08:48:43"
  "updated_at" => "2021-10-05 08:48:43"
  "expired_at" => "2021-10-09 08:48:43"
  "booked" => 0
  "reference" => null
  "utm" => ""
  "updates" => []
]

返回null

   array:21 [
      "id" => 5887894545
      "steps" => null
      "created_at" => "2021-10-05 08:48:43"
      "updated_at" => "2021-10-05 08:48:43"
      "expired_at" => "2021-10-09 08:48:43"
      "booked" => 0
      "reference" => null
      "utm" => ""
      "updates" => []
    ]

返回Call to a member function addEagerConstraints() on array:

public function steps() 
    return $this->hasOne("App\Compares\ComparesSteps", "compare_id", "id")->value("steps");

返回Undefined property: Illuminate\\Database\\Eloquent\\Relations\\HasOne::$steps

public function steps() 
    return $this->hasOne("App\Compares\ComparesSteps", "compare_id", "id")->steps;

预期结果:

   array:21 [
      "id" => 5887894545
      "steps" => array:12 [
          0 => 1
          1 => 2
          2 => 3
          3 => 4
          4 => 13
          5 => 6
          6 => 7
          7 => 17
          8 => 8
          9 => 9
          10 => 10
          11 => 12
      ]
      "created_at" => "2021-10-05 08:48:43"
      "updated_at" => "2021-10-05 08:48:43"
      "expired_at" => "2021-10-09 08:48:43"
      "booked" => 0
      "reference" => null
      "utm" => ""
      "updates" => []
    ]

更新基于与@MaartenDev 在 cmets 中的对话

我想在模型被调用时将$model->steps->steps 附加到$model->steps。由于我正在更新数据库表以将某些数据拆分为表,并希望在调用模型时保持数据结构相同。

例如如果您使用的是 getUserCountAttribute,您可以通过 hasMany()->Count() 轻松返回数字。

所以我想在调用模型时将steps 数组附加到steps 属性。

【问题讨论】:

试试->steps(); @DimitriMostrey - 这给出了以下Call to undefined relationship 请添加一个您尝试如何访问关系的示例 @MaartenDev 该示例已经存在它在第一个代码块中protected $with = ["steps"]; 它在调用我的模型时默认访问关系Steps::where("id", 200")->first(); @MaartenDev 我也试过用getStepsAttribute()的方法附加属性 【参考方案1】:

是否可以选择使用steps 关系的自定义getter?您可以使用 $appends 预加载值。

class Model 
    protected $appends = ["steps"];
    protected $hidden = ['stepsRelation']

    public function getStepsAttribute()
    
        return $this->stepsRelation->steps;
    
    
    private function stepsRelation() 
        return $this->hasOne("App\Compares\ComparesSteps", "compare_id", "id");
    

查看Laravel docs on appends。

【讨论】:

stepsRelation 如何在不被调用的情况下访问getStepsAttribute,我刚刚尝试过。由于$with = ["stepsRelation"],这似乎没有拿起getStepsAttribute,只调用stepsRelation。您必须设置 $appends 才能使 getter 方法起作用 您直接调用steps 属性而不是使用关系。当您使用$model->steps 访问步骤时,它是否有效? 我已经让它与以下protected $appends = ['steps']; 一起使用。所以而不是$with 使用$appends 太棒了!我把你的编辑和我的合并了,祝你好运:) 您可以尝试将关系方法设为私有或将其添加到模型中的$hidden = ['stepsRelation']

以上是关于HasOne 显示“null”或“未定义属性:Illuminate\\Database\\Eloquent\\Relations\\HasOne”的主要内容,如果未能解决你的问题,请参考以下文章

流利的休眠 HasOne WithForeignKey 不起作用

yii2 hasOne, 在列表显示分类名称

LARAVEL - 如何获取模型的属性

grails hasOne vs 直接成员变量

laravel5.4hasOne和belongsTo的区别

laravel 中的 Eloquent ORM 里,hasOne 和 belongsTo 有啥区别