热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:Yii2中的线程数据

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Yii2中的线程数据相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Yii2中的线程数据相关的知识,希望对你有一定的参考价值。



我正在寻找通过Active Record解决方案来获得单个查询中的分层数据。

我现在正在做的是首先获取所有数据,然后使用递归函数将数组转换为所需的数组。

$allUsers = User::find()
->asArray()
->all();
$arr = Yii::$app->TreeComponent->getUserChildren($allUsers, $userId, $userId);

并在TreeComponent中

public function getUserChildren($src_arr, $currentId, $userId, $parentFound = false)
{
$cats = array();
foreach ($src_arr as $row) {
if ($row['id'] == $userId) {
$row['parent'] = "";
}
if ((!$parentFound && $row['id'] == $currentId) || $row['parent'] == $currentId) {
$rowData = array();
foreach ($row as $k => $v)
$rowData[$k] = $v;
$cats[] = $rowData;
if ($row['parent'] == $currentId) {
$cats = array_merge($cats, $this->fetchRecursive($src_arr, $row['id'], true));
}
}
}
return $cats;
}

它的工作正常。但最近我通过CakePHP的find('threaded'),我认为它将节省递归函数执行时间和更少的代码。

我很好奇Active Record是否还有任何功能。


答案

在Yii2中没有这样的功能。 Cakephp还将在后台执行多个查询,并将其包装在多线程调用中。如果您实际上只能执行一个查询,那么您将获得主要的速度优势。

有两种方法可以实现这一目标:



  • 您的方式...获取所有内容并将其合并到您的代码中

  • 上面的注释中提到的NestedSet模式

NestedSet

对于Yii2,我们有一个很好的扩展来实现嵌套的set模式。你可以在这里找到它:

https://github.com/creocoder/yii2-nested-sets

优点和缺点

显然,优点是您可以使用单个查询获取所有内容。您甚至可以在一个表中保存多个树。

主要缺点是根据列进行排序,同时仍保持树结构。嵌套集由两个属性组成:左和右。这意味着,所有数据都根据这两个属性进行排序。要获取按名称排序的树结构,您仍然必须实现代码端功能以在查询后更改接收的数据集。最干净的方法是在保存时对数据进行排序...意味着根据所需排序中的位置插入新记录

维基百科对嵌套集有很好的解释:qazxsw poi

此图显示了它的工作原理:

https://en.wikipedia.org/wiki/Nested_set_model

示例:'slacks'和'jacket'是'suit'的子项,因为它们的左右属性都在'suit'的left(3)和right(8)值之间。如果你想将一个孩子添加到'夹克',你会在6到7之间注入它...因此将所有值增加到大于或等于7乘以2。然后,新注入的“夹克”子项将接收左值7和右值8。

如您所见,您现在可以通过过滤左右属性轻松获取整个(子)树。如果您想要从“西装”向下的所有内容,您的查询将如下所示:

NestedSet illustration

最后回答你的问题

如果你的主要关注是舒适

不,没有这样的功能。如果您仍然希望数据库中有常规树,并且不想关心合并数据,则必须为CakePHPs方法编写similliar功能。这应该很容易,我想会有很多人对它感兴趣。

如果你主要担心的是速度

使用嵌套集。这是一个模式和地狱强大的地狱!


另一答案

这是另一种存储树并在没有递归的情况下获取树的方法。它需要2个表。

SELECT * FROM mytable WHERE left >= 3 AND right <= 8 ORDER BY left ASC

例:

tree_data
Column | Type |
-----------+---------+
id | integer |
parent_id | integer |
level | integer |
sort | integer |
tree_structure
Column | Type |
--------+---------+
parent | integer |
child | integer |

结果树:

select * from tree_data;
id | parent_id | level | sort
----+-----------+-------+------
1 | 0 | 0 | 1000
2 | 1 | 1 | 1000
3 | 1 | 1 | 2000
4 | 1 | 1 | 1500
5 | 1 | 1 | 1750
6 | 5 | 2 | 1000
select * from tree_structure order by parent, child;
parent | child
--------+-------
1 | 1
1 | 2
1 | 3
1 | 4
1 | 5
1 | 6
2 | 2
3 | 3
4 | 4
5 | 5
5 | 6
6 | 6

要查询树:

├── 1
│ ├── 2
│ ├── 4
│ ├── 5
│ ├── 6
│ ├── 3

这是SELECT tree_data.*
FROM tree_data
INNER JOIN tree_structure ON tree_data.id = tree_structure.child and tree_structure.parent = 1
ORDER BY level, sort;
的一组类



推荐阅读
  • 湍流|低频_youcans 的 OpenCV 例程 200 篇106. 退化图像的逆滤波
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了youcans的OpenCV例程200篇106.退化图像的逆滤波相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文是一篇翻译文章,介绍了async/await的用法和特点。async关键字被放置在函数前面,意味着该函数总是返回一个promise。文章还提到了可以显式返回一个promise的方法。该特性使得async/await更易于理解和使用。本文还提到了一些可能的错误,并希望读者能够指正。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • Python操作MySQL(pymysql模块)详解及示例代码
    本文介绍了使用Python操作MySQL数据库的方法,详细讲解了pymysql模块的安装和连接MySQL数据库的步骤,并提供了示例代码。内容涵盖了创建表、插入数据、查询数据等操作,帮助读者快速掌握Python操作MySQL的技巧。 ... [详细]
  • 一基础代码检查    检查以bm_开头的系统初始化编码表是否有空值。与业务系统相关的编码项不能存在空值,会导致系统业务无法办理。为初始化数据表、在做测试数据和正式上线前检查。上线 ... [详细]
  • Ihavethisfollowinginputfile:我有以下输入文件:test.csvdone_cfg,,,,port<0>,clk_in,subcktA,ins ... [详细]
  • php连接mysql显示数据,php连接mysql数据库的算法思想
    本文目录一览:1、怎么用php显示mysql数据表数据 ... [详细]
  • Git GitHub多人协作
    在学校做一个小项目需要多人协作,就用到了gitHub,百度了一下多数写得乱七八糟或者支离破碎,于是总结了一下自己的步骤如下,第一次使用GitHUb,哪里不对望大神指出一.前期准备: ... [详细]
  • Za2019.8.30SDOI2011计算器[BZOJ2242][luoguP2485]1、给定y、z、p,计算y^zmodp的值;2、给定y、z、p& ... [详细]
author-avatar
tcystars_628
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有