【问题标题】:Relationship is loaded but returns null when I call it关系已加载,但当我调用它时返回 null
【发布时间】:2019-11-11 22:36:15
【问题描述】:

我查询模型“Royalty”并急切加载关系“所有者”。模型返回结果,包括关系。

class Royalty extends Model
{
    protected $guarded = [];
    protected $dates   = ['created_at', 'updated_at', 'date', 'calculated_at'];

    protected $casts = [
        'properties' => 'object',
    ];

    public function owner()
    {
        return $this->belongsTo(Owner::class);
    }
}

class Owner extends Model
{
    use SoftDeletes;
    protected $guarded = [];
    protected $dates    = ['created_at', 'updated_at', 'deleted_at'];

    protected $casts = [
        'properties' => 'object',
    ];


    public function royalties()
    {
        return $this->hasMany(Royalty::class);
    }
}

$royalty = Royalty::with('owner')->where('id', 1)->first();

结果符合预期,关系“所有者”已预先加载:

Royalty {#542 ▼
  #guarded: []
  #dates: array:4 [▶]
  #casts: array:1 [▶]
  #connection: "development"
  #table: "royalties"
  #primaryKey: "id"
  #keyType: "int"
  +incrementing: true
  #with: []
  #withCount: []
  #perPage: 15
  +exists: true
  +wasRecentlyCreated: false
  #attributes: array:21 [▶]
  #original: array:21 [▶]
  #changes: []
  #dateFormat: null
  #appends: []
  #dispatchesEvents: []
  #observables: []
  #relations: array:1 [▼
    "owner" => Owner {#562 ▼
      #guarded: []
      #dates: array:4 [▶]
      #casts: array:1 [▶]
      #connection: "development"
      #table: "owners"
      #primaryKey: "id"
      #keyType: "int"
      +incrementing: true
      #with: []
      #withCount: []
      #perPage: 15
      +exists: true
      +wasRecentlyCreated: false
      #attributes: array:8 [▶]
      #original: array:8 [▶]
      #changes: []
      #dateFormat: null
      #appends: []
      #dispatchesEvents: []
      #observables: []
      #relations: []
      #touches: []
      +timestamps: true
      #hidden: []
      #visible: []
      #fillable: []
      #forceDeleting: false
    }
  ]
  #touches: []
  +timestamps: true
  #hidden: []
  #visible: []
  #fillable: []
}

但是,当我调用与 $royalty->owner 的关系时,结果为 NULL。我在这里做错了什么?

dd($royalty->owner); NULL

【问题讨论】:

  • 试试dd($royalty['owner'])
  • 当我做 dd($royalty['owner']) 时也为 NULL
  • 你能提供来自你的控制器和表结构的代码吗?
  • 额外信息:当我尝试 $owner = $royalty->owner()->first();我得到了主人的预期。所以好像关系没什么问题?
  • royalties 表是否有 owner 列?

标签: laravel eloquent relationship eager-loading


【解决方案1】:

你必须像这样定义你的关系, 在版税模型中请定义

public function owner() { return $this->belongsTo(Owner::class,'owner_id'); } 并将id 作为所有者模型中的可填写对象。

还有你的

public function royalties() { return $this->hasMany(Royalty::class); } 完美

【讨论】:

  • @Arjan 在您的模型中您没有指定任何可填充列至少为两个模型指定一个可填充列
  • 我已经将两个模型都更改为受保护的 $fillable = ['id']。虽然我可以看到关系已加载,但仍然为 NULL...
  • @Arjan 不仅id 将一些数据填充到新列中,例如name 或其他任何内容
  • 添加了其他几列。仍然为空!
【解决方案2】:

发生这种情况的主要原因有两个。

  • 一是数据库中的信息有变化
  • 您在模型Owner 中重载了toArray() 方法(我知道它不在您的示例中)

【讨论】:

  • 我可以确认数据库没有被更改。另外,我在 Owner 模型中没有对 toArray() 的任何引用......
  • 您是否尝试过删除 $cast 属性。 protected $casts = [ 'properties' => 'object', ];
  • 运行作曲家更新,这不是Illumination/laravel的正常行为
  • @Arjan 有什么更新吗?你找到这种行为的原因了吗
  • 不,我做了作曲家更新,但问题仍然存在。很奇怪,因为似乎与皇室模型的其他一些关系正常工作。
【解决方案3】:

您必须使用可填充而不是保护。

class Royalty extends Model
{
    protected $fillable = [ 'id', ...];
    protected $dates   = ['created_at', 'updated_at', 'date', 'calculated_at'];

    protected $casts = [
        'properties' => 'object',
    ];

    public function owner()
    {
        return $this->belongsTo(Owner::class);
    }
}

【讨论】:

  • 我将所有列从 $guarded 更改为 $fillable。但是结果还是NULL...
  • 在您的控制器中填写后,您必须在查询后编写。 dd($royalty);
  • 当我做 dd($royalty->owner) 我仍然得到 NULL。但是,当我 dd($royalty)...
猜你喜欢
  • 1970-01-01
  • 2019-03-12
  • 2016-05-01
  • 1970-01-01
  • 2016-07-02
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
相关资源
最近更新 更多