Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel 关系已加载,但调用时返回null_Laravel_Eloquent_Relationship_Eager Loading - Fatal编程技术网

Laravel 关系已加载,但调用时返回null

Laravel 关系已加载,但调用时返回null,laravel,eloquent,relationship,eager-loading,Laravel,Eloquent,Relationship,Eager Loading,我查询一个模型“版税”,并急切地加载关系“所有者”。模型返回结果,包括关系 class Royalty extends Model { protected $guarded = []; protected $dates = ['created_at', 'updated_at', 'date', 'calculated_at']; protected $casts = [ 'properties' => 'object', ];

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

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

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

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

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

  • 其一是数据库中的信息已被删除
  • 您在模型
    Owner
    中重载了
    toArray()
    方法(我知道您的示例中没有)

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

      public function owner()
      {
      返回$this->belongsTo(Owner::class,'Owner\u id');
      }
      并将
      id
      作为所有者模型中的可填充项

      还有你的

      public function版税()
      {
      返回$this->hasMany(版税::类);
      
      }
      是完美的

      尝试
      dd($royalty['owner'])
      当我进行dd($royalty['owner'])时也为空。你能从你的控制器和表结构中提供代码吗?额外信息:当我尝试$owner=$royalty->owner()->first()时;我得到了预期的主人。因此,这种关系似乎没有什么问题?
      版税
      表是否有一个
      所有者
      列?我将$guarded更改为$fillable,包含所有列。但结果仍然为空…在控制器中可填充后,必须在查询后写入。dd(特许权使用费);当我做dd($royalty->owner)时,我仍然得到空值。但是,当我进行dd($royalty)…时,所有者是可用的。我可以确认数据库没有更改。另外,我在所有者模型中没有对toArray()的任何引用……您是否尝试删除$cast属性<代码>受保护的$casts=[“属性”=>“对象”,]运行编写器更新,这不是脚本的正常行为/laravel@Arjan有更新吗?你找到这种行为的原因了吗?没有,我更新了作曲家,但问题仍然存在。非常奇怪,因为似乎与版税模型的某些其他关系正常工作。@Arjan在您的模型中,您没有指定任何可填充列,至少为两个模型指定一个可填充列。我已经将两个模型都更改为受保护的$filleble=['id']。当我可以看到关系被加载时,仍然是空的…@Arjan不仅
      id
      将一些数据填充到一个新列中,如
      name
      或其他任何其他列。还是空的!