排序一个Eloquent模型



MyModel的表格如下

id      name        parent_id
--------------------------
1      parent1       null
2      p1-c1         1
3      parent2       null
4      p1-c1-g1      2
5      p2-c1         3
6      p1-c1-g1-f1   4
7      parent3       null
8      p1-c2         1
9      p3-c1         7
10     p1-c2-c1      8

如何使用雄辩或原始数据库查询进行订单,而不获取下面的所有行

Collection {#499 ▼
#items: array:22 [▼
0 => MyModel {#524 ▶} // parent1
1 => MyModel {#525 ▶} // p1-c1
2 => MyModel {#526 ▶} // p1-c1-g1
3 => MyModel {#527 ▶} // p1-c1-g1-f1
4 => MyModel {#528 ▶} // p1-c2
5 => MyModel {#529 ▶} // p1-c2-c1
6 => MyModel {#530 ▶} // parent2
7 => MyModel {#531 ▶} // p2-c1
8 => MyModel {#532 ▶} // parent3
9 => MyModel {#533 ▶} // p3-c1
]
}

以便更好地查看和理解

parent1
p1-c1
p1-c1-g1
p1-c1-g1-f1
p1-c2
p1-c2-c1
parent2
p2-c1
parent3
p3-c1

使用同一表的递归关系

例如,如果型号名称为MyModel,则关系将为

public function child(){
return $this->hasMany(MyModel::class,'parent_id','id');
}
public function recursiveChild(){
return $this->child()->with('recursiveChild');
}

所以在你的控制器

MyModel::with(['recursiveChild'])->get();

您的实际代码是什么,您试图用它实现什么?收藏是你在拉拉维尔的朋友。如果你有一个相关的表,你可以做groupBy或使用With。。。你的问题真的太含糊了。你可以通过许多带有限制和groupBy的链接Where或Where来变得相当复杂我所看到的是,你不仅需要数据库中的父级,还需要对子级进行排序。另一个想法是,你需要祖父母、父母、孩子吗?在这种情况下,你必须有专栏,让所有人在构建你的收藏或直接进行雄辩的拉动时都知道自己属于谁。我猜这是给菜单或你这里的东西的。又是模棱两可,完全是猜测。

编辑 我在几个应用程序中都做过这种事情。。。你的桌子看起来像这样:

id, name, menu_type, url, page_id, parent_id, sidebar, order, depth, role, created_at, updated_at, deleted_at

所以在你的模型中,你会想建立一段关系:

public function parent()
{
return $this->belongsTo('AppModelsMenus', 'parent_id');
}
public function children()
{
return $this->hasMany('AppModelsMenus', 'parent_id')->orderBy('order', 'asc');
} 

然后我所做的就是把它作为一种特性,这样它就可以在我需要的地方使用

这个特点比你要求的要复杂一点,但它为你指明了方向。

public function PrimaryMenu($pageid , $namespace, $user) {
// Get all primary menu items.
$appspace = "AppModels\".$namespace."\Menus";
$roles = $user->roles->pluck('name');
$pmenus = $appspace::with('children')->where([['menu_type', '=', 'primary'],['parent_id','=', NULL]])->
where(function ($q) use($pageid) {
$q->where('page_id', '=', $pageid)->orWhere('page_id', NULL);
})->
where(function ($q2) use($roles) {
$q2->whereIn('role', $roles)->orWhere('role', '=', NULL);
})->
get();
return $pmenus;
}

你可以看到,在这种情况下,我正在检查一种类型的菜单(这可以是任何东西,只要你有东西可以按类别对它们进行分组(,然后我检查页面,看看我们是否应该在页面上包括一行,然后我检查用户可能拥有的任何角色,我们应该包括项目。

然后在你的控制器中,只需要使用顶部的特性:

use AppTraitsCommonTrait; 

现在,所有这些特性都可以在控制器中使用。所以你只需要调用你需要的函数:

$pmenus=$this->PrimaryMenu($pageid,$namespace,$user(;

你可以看到,我正在向它发送3个变量,因为我已经设置了许多菜单。实际上,该代码可以转换为任何您希望孩子与父母关联的内容。

重要的部分是对关系的模型操作。

谢谢大家,我用这个包实现了这样的排序。

https://github.com/lazychaser/laravel-nestedset#building-平面树

最新更新