【问题标题】:Laravel relationship with belongsTo with 0 idsLaravel 与 belongsTo 的关系,id 为 0
【发布时间】:2018-08-05 17:29:22
【问题描述】:

我找不到用雄辩的方法来做到这一点。我的架构看起来像这样。

选举

  • 身份证
  • 标题

位置

  • 身份证
  • election_id
  • 标题

现在,election_id 可以包含 0(表示适用于所有选举)或elections 表中的任何 id

我的 Election 模型包含 hasManyPositions 模型的关系,但现在我只获得具有相同 election_id 的那些职位,而不是那些具有0 个值。

我的选举模型片段:

public function positions()
{
    return $this->hasMany(Position::class, 'election_id', 'id');
}

这可以用雄辩的吗?还是我应该求助于另一个查询?我想尽可能雄辩地做到这一点,因为我需要在我的 ElectionResource 类中加载关系。

我的 ElectionResource 类的片段:

    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'title' => $this->title,
            'positions' => PositionResource::collection($this->whenLoaded('positions')),
        ];
    }

【问题讨论】:

  • 所以你的选举/职位表可以有 0 id 的记录??
  • 我的positions 表中的election_id 可以包含0
  • 但是选举表中不会有id为0的记录吧??
  • 是的,没错
  • 那么你到目前为止所做的一切都很好,选举没有任何 id 为 0 的记录,这就是为什么你没有得到任何 0 选举 ID 的职位数据

标签: laravel eloquent relationship


【解决方案1】:

可以制作外键列nullable

$table->unsignedInteger('election_id')->nullable();

然后做这样的事情:

Election::doesntHave('position')->get();

如果您想获得不属于任何选举的职位,请执行以下操作:

Position::whereNull('election_id')->get();

【讨论】:

  • 是的,但是我将如何构建我的 hasMany 关系?
  • @PaulSantos 使用相同的关系,但使用doesntHave 在没有任何职位的情况下获得选举。我还添加了一个解决方案来获取所有不属于任何选举的职位。
  • 我必须在我的选举模型中加载positions。比如Election::with('positions')->get();
  • @PaulSantos 这个查询只会加载属于选举的职位。正如我在答案中所示,您需要执行第二个查询才能获得没有附加选举的职位。
猜你喜欢
  • 1970-01-01
  • 2019-05-26
  • 2018-03-08
  • 2020-01-15
  • 2021-04-05
  • 2023-04-02
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多