【问题标题】:Laravel collection 2nd result set relationship always nullLaravel 收集第二个结果集关系始终为空
【发布时间】:2019-05-25 11:02:08
【问题描述】:

我有一个查询,我正在返回一个一对多的关系,我期望它们的关系都有两个结果。第一个结果正确返回,但在第一个结果之后,对于第一个结果之后的每个结果,我总是为我的关系数据获得一个 NULL 值。

如果我删除数据库中的第一条记录,那么第二条记录将成为第一条并且它会正确返回。

这是我的查询 -

$groups = DataGroup::where('post_id', $post->id)->with('data.dataType')->get();

数据组关系

public function data()
{
    return $this->hasMany('App\Data', 'data_group_id');
}

数据关系

public function dataType()
{
    return $this->belongsTo('App\DataTypes', 'id');
}

public function dataGroup()
{
    return $this->belongsTo('App\DataGroup', 'id');
}

数据类型关系

public function data()
{
    return $this->hasMany('App\Data', 'data_types_id');
}

结果集(为了便于阅读,去掉了其他信息)

Collection {#259 ▼
  #items: array:2 [▼
    0 => Data {#272 ▼
      #fillable: array:5 [▶]
      #attributes: array:8 [▶]
      #original: array:8 [▶]
      #relations: array:1 [▼
        "dataType" => DataTypes {#271 ▶}
      ]
    }
    1 => Data {#268 ▼
      #fillable: array:5 [▶]
      #attributes: array:8 [▶]
      #original: array:8 [▶]
      #relations: array:1 [▼
        "dataType" => null
      ]

数据组表

---------------------
| id | post_id      |
--------------------
| 1  | 2            |
--------------------

数据类型表

---------------------
| id | label | name |
--------------------
| 1  | Text  | text |
--------------------

数据表

------------------------------------------------------------
| id | data_types_id | data_group_id | field_label | value |
------------------------------------------------------------
| 1  |  1            | 1             | Title       | NULL  |
------------------------------------------------------------
| 2  |  1            | 1             | Sub Heading | NULL  |

【问题讨论】:

  • 您可以尝试按以下顺序运行代码吗:$groups = DataGroup::with('data.dataType')->where('post_id', $post->id)->get(); 我过去注意到这会产生不同的结果(在 where 之前使用)。如果失败了,你能告诉我们你的数据库数据吗?(也许写一个带有连接的查询并向我们展示结果应该是什么:))
  • 谢谢@RobBiermann 我厌倦了你的查询,但我仍然得到null 关系的价值,我已经用数据库表更新了我的问题。
  • 感谢您的信息,它帮助我得出结论;)

标签: laravel laravel-5 eloquent


【解决方案1】:

我相信如果你改变:

public function dataType()
{
    return $this->belongsTo('App\DataTypes', 'id');
}

进入:

public function dataType()
{
    return $this->belongsTo('App\DataTypes', 'data_type_id');
}

这应该可以解决问题,它当前正在尝试引用不存在的 id 为 2(即数据 2 的 id)的数据类型。

查看https://laravel.com/docs/5.8/eloquent-relationships#one-to-one段落的下部,它描述了您需要输入外键作为关系定义的第二个变量,而不是本地键。

顺便说一句:你的其他关系也有同样的问题:

public function dataGroup()
{
    return $this->belongsTo('App\DataGroup', 'id');
}

【讨论】:

  • 是的,很清楚 1 个对象返回的事实纯属运气,因为它们是数据库的第一个实例。我首先定义本地键,而不是正确分配外键。谢谢
猜你喜欢
  • 2016-07-13
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
相关资源
最近更新 更多