猿问

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

我有一个下拉菜单来选择一个父级,它是对页面的自引用。我想限制该下拉列表的结果,以便它不允许我嵌套一个页面超过一个级别。


如果我编辑“儿子”页面,而“儿子”有一个“孙子”,则不应允许我选择“爸爸”作为儿子的父母,因为它会创建一个太深的巢


在以下情况下,当我编辑儿子记录时,我不应该选择父亲作为父亲,因为儿子有孩子。


+----+-----------+----------+

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


ABOUTYOU
浏览 170回答 3
3回答

LEATH

您可以在 Page 模型中创建父子关系。public function parent(){&nbsp; &nbsp; return $this->belongsTo('Page', 'parent_id');}public function children(){&nbsp; &nbsp; return $this->hasMany('Page', 'parent_id');}现在,您可以检查 Page 是否有孩子,并像这样提取父 ID 为 null 的记录:$pages = Page::where('parent_id', null)->doesntHave('children')->get();这将为您提供父 ID 为 null 且没有子项的记录。我希望你明白。

胡子哥哥

嗯...我认为不可能将其分解为一行,因为我就像您必须循环 parent_id 列检查当前 id 是否在 parent_id 列中:但不用担心:不同的方法会更容易:两个单独的表,因此不同的关系:Pages model: has one parentParents model: belongs to a page有了上面的关系,你可以很容易地使用 eloquent 来获得没有父级的东西,只需检查哪里没有给定的关系:打破这个:Pages model:public function parents () {&nbsp; &nbsp; return $this->hasOne(Parent::class, 'page_id');}对父母模型:&nbsp;Parents model:&nbsp;protected $fillable = ['page_id'];&nbsp;public function pages () {&nbsp; &nbsp; &nbsp;return $this->belongsTo(Page::class, 'page_id');&nbsp;}
随时随地看视频慕课网APP
我要回答