为了账号安全,请及时绑定邮箱和手机立即绑定

Laravel Query Builder,根据条件在哪里?

Laravel Query Builder,根据条件在哪里?

PHP
ABOUTYOU 2021-10-15 16:07:23
我有一个下拉菜单来选择一个父级,它是对页面的自引用。我想限制该下拉列表的结果,以便它不允许我嵌套一个页面超过一个级别。如果我编辑“儿子”页面,而“儿子”有一个“孙子”,则不应允许我选择“爸爸”作为儿子的父母,因为它会创建一个太深的巢在以下情况下,当我编辑儿子记录时,我不应该选择父亲作为父亲,因为儿子有孩子。+----+-----------+----------+| id | parent_id |  title   |+----+-----------+----------+|  1 | NULL      | Dad      ||  2 | NULL      | Son      ||  3 | 2         | Grandson |+----+-----------+----------+现在在这种情况下,我应该能够在编辑儿子记录时选择爸爸作为父母,因为儿子没有任何孩子+----+-----------+----------+| id | parent_id |  title   |+----+-----------+----------+|  1 | NULL      | Dad      ||  2 | NULL      | Son      ||  3 | NULL      | Grandson |+----+-----------+----------+我正在努力解决这个问题,以及如何将这一切都包装在查询构建器中。到目前为止我所拥有的如果儿子有自己的孩子,以下代码有效,我将无法选择爸爸,这很好。但是当没有孩子时它会失败。归结为:我的父选择也应该允许显示 parent_id 为空的页面,但前提是当前记录(儿子)没有任何孩子。回顾:仅显示没有出现在任何 parent_id 中的记录,因此没有子项,如果有,则不显示任何记录。如果没有,则应显示 parent_id 为空的记录。这在一个查询中是可能的吗?$query->where('id', '<>', $page->id);$query->where('parent_id', '<>', $page->id);
查看完整描述

3 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

您可以在 Page 模型中创建父子关系。


public function parent()

{

    return $this->belongsTo('Page', 'parent_id');

}


public function children()

{

    return $this->hasMany('Page', 'parent_id');

}

现在,您可以检查 Page 是否有孩子,并像这样提取父 ID 为 null 的记录:


$pages = Page::where('parent_id', null)->doesntHave('children')->get();

这将为您提供父 ID 为 null 且没有子项的记录。我希望你明白。


查看完整回答
反对 回复 2021-10-15
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

嗯...我认为不可能将其分解为一行,因为我就像您必须循环 parent_id 列检查当前 id 是否在 parent_id 列中:


但不用担心:不同的方法会更容易:两个单独的表,因此不同的关系:


Pages model: has one parent

Parents model: belongs to a page

有了上面的关系,你可以很容易地使用 eloquent 来获得没有父级的东西,只需检查哪里没有给定的关系:


打破这个:


Pages model:


public function parents () {

    return $this->hasOne(Parent::class, 'page_id');

}

对父母模型:


 Parents model:


 protected $fillable = ['page_id'];


 public function pages () {

     return $this->belongsTo(Page::class, 'page_id');

 }


查看完整回答
反对 回复 2021-10-15
  • 3 回答
  • 0 关注
  • 169 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信