Laravel 递归关系

2023-12-07

我正在做一个项目Laravel。我有一个可以有父母或可以有孩子的帐户模型,所以我的模型设置如下:

public function immediateChildAccounts()
{
    return $this->hasMany('Account', 'act_parent', 'act_id');
}

public function parentAccount()
{
    return $this->belongsTo('Account', 'act_parent', 'act_id');
}

这很好用。我想做的是将所有孩子都放在某个帐户下。目前,我正在这样做:

public function allChildAccounts()
{
    $childAccounts = $this->immediateChildAccounts;
    if (empty($childAccounts))
        return $childAccounts;

    foreach ($childAccounts as $child)
    {
        $child->load('immediateChildAccounts');
        $childAccounts = $childAccounts->merge($child->allChildAccounts());
    }

    return $childAccounts;
}

这也有效,但我不得不担心它是否很慢。这个项目是我们在工作中使用的旧项目的重写。我们将有数千个帐户迁移到这个新项目。对于我拥有的少数测试帐户,此方法不会造成性能问题。

有更好的解决方案吗?我应该只运行原始查询吗?做Laravel有什么办法可以处理这个吗?

总之对于任何给定帐户,我想要做的是在单个列表/集合中获取每个子帐户及其子帐户的每个子帐户等。一张图:

A -> B -> D
|--> C -> E
     |--> F 
G -> H

如果我运行 A->immediateChildAccounts(),我应该得到 {B, C}
如果我运行 A->allChildAccounts(),我应该得到 {B, D, C, E, F} (顺序无关紧要)

同样,我的方法有效,但似乎我做了太多查询。

另外,我不确定在这里问这个是否可以,但它是相关的。我怎样才能获得所有帐户的列表don't包括儿童账户吗?所以基本上与上面的方法相反。这样用户就不会尝试为帐户提供已经是子帐户的父帐户。使用上面的图表,我想要(以伪代码):

Account::where(account_id 不在 (A->allChildAccounts()) 中)。所以我会得到 {G, H}

感谢您的任何见解。


这是使用递归关系的方式:

public function childrenAccounts()
{
    return $this->hasMany('Account', 'act_parent', 'act_id');
}

public function allChildrenAccounts()
{
    return $this->childrenAccounts()->with('allChildrenAccounts');
}

Then:

$account = Account::with('allChildrenAccounts')->first();

$account->allChildrenAccounts; // collection of recursively loaded children
// each of them having the same collection of children:
$account->allChildrenAccounts->first()->allChildrenAccounts; // .. and so on

这样您就可以节省大量查询。这将为每个嵌套级别执行 1 个查询 + 1 个附加查询。

我不能保证它对您的数据有效,您需要绝对测试它。


这是针对无子账户的:

public function scopeChildless($q)
{
   $q->has('childrenAccounts', '=', 0);
}

then:

$childlessAccounts = Account::childless()->get();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Laravel 递归关系 的相关文章

  • 使用 ImageMagick (PHP) 将 2 个图像并排合并为 1 个图像

    我认为这是一件容易的事 我有 2 张图片 JPG 我希望它们合并成一张图片 其中 2 张图片并排 所以我有图片 A 和图片 B 我想要图片 AB 并排 两个图像具有相同的宽度和高度 在本例中 宽度 200px 高度 300px 但是第二个图
  • PHP条件,如果当前页面,则链接突出显示[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我有一个带
  • 更改 Woocommerce 中“我的帐户”页面上的标题

    我见过大量有关如何使用 WooCommerce 我的帐户仪表板重新排序 更改导航和页面的示例 但我一生都无法弄清楚如何更改每个部分的主要标题 我的帐户 订单 下载 地址等 我已经搜索过模板 但没有任何乐趣 我尝试使用条件 php 注释来回显
  • Smarty 如果 URL 包含

    使用 Smarty 标签我想确定 URL 是否包含单词 例如 if smarty get page contains product php 我知道 contains 不存在 但是我怎样才能轻松地编写类似的东西来实现上述代码呢 所有 PHP
  • 如何让Apache服务index.php而不是index.html?

    如果我将以下行放入index html文件 使 Apache 包含index php file 参观index html页面向我显示了这个 这是为什么 为什么它实际上不包含 PHP 文件 正如其他人指出的那样 您很可能没有 html设置为处
  • php中的条件格式化html表与时间戳比较

    echo table style width 100 tr echo td Order td echo td Destination td echo td Location td echo td Status td echo td Time
  • 媒体的 Google Cloud Storage 签名网址

    我已经建立了一个视频网站 为用户提供 m3u8 和关联的 ts 文件 我不希望媒体文件免费可用 所以我所做的是 当用户在网站上时 在 mysql 中使用他们的 IP 和令牌创建一个会话 当他们请求特定媒体子域 mp4 domain com
  • 在 PHP 中比较两个对象的最快方法是什么?

    假设我有一个对象 在本例中为 User 对象 并且我希望能够使用单独的类来跟踪更改 用户对象不必以任何方式改变它的行为才能发生这种情况 因此 我的单独的类创建它的 干净 副本 将其存储在本地某个位置 然后可以将 User 对象与原始版本进行
  • PHP - 类外 use 关键字和类内 use 关键字的区别

    伙计们 美好的一天 只是想问一下有什么区别use之外的class and use在 的里面class 我也用谷歌搜索过 但我的问题与答案不匹配 Example namespace App Http Controllers Auth use
  • 如何在多次尝试后延迟登录尝试 (PHP)

    我正在开发一个用 PHP 构建的相当大的网站 该网站可能会有很多用户 我正在寻找一种方法来保护登录屏幕免受自动尝试的影响 我已经在注册表中添加了验证码检查 但还想进一步强化网站 据我所知 StackOverflow 上也有类似的问题 而且我
  • 使用 Instagram Basic Display API 时出现“无效平台应用程序”错误

    我正在尝试使用 Instagram Basic 显示 API 但是当我发布授权代码以获取访问令牌时 我不断收到以下错误 error type OAuthException 代码 400 error message 平台应用无效 我正在遵循此
  • 在 WooCommerce 中添加到购物车之前清空购物车

    我正在使用 WP 作业管理器和 Woo Subscriptions Now 最初 我选择了一个套餐 Woo Subscription 然后我添加了所有细节 但没有提交 回到网站 所以要再次购买 我需要选择一个套餐 于是我选择了套餐并填写了详
  • 在 Yii 的标准中如何获得计数 (*)

    我正在尝试构建一个具有以下内容的查询group by属性 我正在尝试得到id和count它一直告诉我count is invalid列名 我怎样才能得到count来自group by询问 工作有别名 伊伊 1 1 11 其他不及格 crit
  • Facebook PHP SDK - 如何获取访问令牌?

    我正在尝试从我的应用程序在用户的 Facebook 墙上发帖 用户授予应用程序在他的墙上发布的权限 并且我在数据库中有用户ID 我需要自动发送帖子 而无需用户再次登录 我的代码是 try require once dirname FILE
  • Ebay api GetSellerList,解析响应 XML

    我正在使用 eBay 交易 api 来获取当前列出的卖家股票 我正在使用 GetSellerList 调用 我在解析 xml 时遇到问题 然后将其插入到网站商店中 这是 xml 请求
  • 如何在 phalcon 框架中同时连接多个数据库在模型类中同时使用两个而不仅仅是一个

    在我的代码中我有两个数据库ABC and XYZ 我想在同一模型中使用两个数据库 而不是 phalcon 中的解决方案是什么 如何为此实现多个数据库连接 one
  • 如何将 Smarty 3 包含到 Laravel 4 中?

    我是 Laravel 的新手 所以仍在习惯这些概念 但是我有大约 10 年的使用 Smarty 的经验 所以我希望利用这一点 除了事实上 Blade 似乎缺乏太多我发现有用且在 Smarty 中开箱即用的功能 但无论如何除了这个问题的要点之
  • 如何通过ssh检查ubuntu服务器上是否存在php和apache

    如何通过ssh检查Ubuntu服务器上apache是 否安装了php和mysql 另外如果安装的话在哪个目录 如果安装了其他软件包 例如 lighttpd 那么它在哪里 确定程序是否已安装的另一种方法是使用which命令 它将显示您正在搜索
  • phpActiveRecord 日期时间格式不正确

    当尝试使用 phpActiveRecord 在表中创建记录时 出现以下错误 Invalid datetime format 1292 Incorrect datetime value 2013 06 20 11 59 08 PDT for
  • 使用 PHP 将 latin1_swedish_ci 转换为 utf8

    我有一个数据库 里面充满了类似的值 Dhaka 应该是 Dhaka 因为我在创建数据库时没有指定排序规则 现在我想修复它 我无法从最初获取数据的地方再次获取数据 所以我在想是否可以在 php 脚本中获取数据并将其转换为正确的字符 我已将数据

随机推荐

  • 使用 Python gtk3 在 X 上进行全局键绑定

    我正在寻找一些可以与 gtk3 一起使用的 python xlib 全局键绑定示例 就像为 gtk2 所做的那样http www siafoo net snippet 239 这里的代码非常相似 from Xlib display impo
  • 如何添加NodeJs、S3、heroku直接上传到android?

    我试图了解如何将他们提供示例的方式从网站转换为 android retrofit 这是该网站的代码示例 function get signed request file var xhr new XMLHttpRequest xhr open
  • 多个子进程在同一管道上读/写

    我目前正在Linux环境中使用C语言学习套接字编程 作为一个项目 我试图编写一个基本的聊天服务器和客户端 目的是让服务器为每个连接的客户端分叉一个进程 我遇到的问题是读取一个孩子的数据并将其写入所有连接的客户端 我尝试通过在子级中循环调用
  • 是否可以在 ES6 Set 实例上使用数组迭代方法?

    我正在使用 ES6 Set 实例 我需要对它们应用一些转换 如果它们是数组的话 这些转换就会很简单 这是一个例子 let s new Set s add 1 s add 2 s add 3 let n s filter val gt val
  • 求和常量时的隐式缩小与求和变量时的显式缩小

    我写了一个程序 class First public static void main String args int c 5 byte b c 6 System out println b 我的 javac 输出是 error incom
  • 将一行转置为多行 Oracle

    我有一个总是返回一行的查询many列 我想把它变成 2 列和许多行 原始结果 Col1 Col2 Col3 Col4 val1 val2 val3 val4 我想要的是 ColName Value Col1 val1 Col2 val2 C
  • 了解 Chrome 网络日志“停滞”状态

    我在 Chrome 中有以下网络登录 我不明白其中的一件事 填充的灰色条和透明的灰色条有什么区别 谷歌对这些字段进行了细分评估网络性能他们的 DevTools 文档的部分 摘自资源网络时序 停滞 阻塞 请求在发送之前等待所花费的时间 该时间
  • 为什么不调用成员变量的移动构造函数?

    考虑以下课程 如果我自己实现移动构造函数如下 为什么是 bar 成员b不是移动而是复制 但如果我使用默认的移动构造函数 那么b被感动了 为什么b rhs b 不打电话bar bar 我使用 g 9 2 1 和 std c 11 class
  • jQuery滚动显示隐藏内容

    如何使默认情况下页面上显示 6 个 div 元素 并且当用户滚动到页面底部时 再加载 6 个元素 如果你看到这个example 它有多个div 我希望最初只显示其中 6 个 每次用户到达页面底部时 我希望再加载 6 个 直到您 用完 div
  • 使用什么语法从 JavaDB 数据库中选择常量字段值?

    我在用着UNION ALL结合几个结果SELECT查询成一ResultSet 我使用常量字段值来标识哪条语句生成了每一行 这适用于 MySQL 但 Java DB 会抛出异常SQLSyntaxErrorException 指向第一个常量字段
  • Mac OSx 10.8 上 IDLE (Python 3.3.2) 中的 NumPy

    我知道这可能是一个重复的问题 但我在这里找到的所有答案都超出了我的想象 我对 Python 很陌生 但我想在 IDLE 中使用 NumPy python 3 3 2 IDLE 似乎无法访问 OSX 10 8 即 python 2 7 附带的
  • 按关键字对数组中的元素进行分组

    我正在 AngularJS 1 上开发一个应用程序 但我不知道如何按项目拆分另一个数组中的项目数组 我的意思是我有一系列不同的项目 我会按 uuid 对项目进行分组 如下所示 name toto uuid 1111 name tata uu
  • 做 {...} while(false)

    我正在查看一个人的一些代码 注意到他的函数中似乎有一个模式
  • 可以使用“new”位置来更改“const”数据吗?

    这是后续memcpy 可以用来更改 const 成员数据吗 And 声明 C 不可变类的惯用方式真正解决这个问题 尤其是this回答 在围绕不可变数据设计的语言中 它知道它可以 移动 您的数据 尽管它具有 逻辑 不变性 Given a st
  • 如何在 AutoFixture 中设置更复杂(类似 IoC)的注册

    使用 AutoFixture 时 是否可以在集成测试中重用生产 IoC 容器注册 问题是 如果未注册依赖项并注入 真实 数据库相关依赖项 我需要以下固定装置设置来注入模拟 var fixture new Fixture WithMocks
  • 使用 JavaFX 将渐变应用于球体对象

    我正在 JavaFX 中工作 我正在尝试将渐变应用于球体 但是 显然 我不知道该怎么做 我被困住了 因为我知道球体是一个对象 所以它需要有一种材质 但是 就颜色而言 PhongMaterial 只采用一种颜色 所以它不会采用渐变 因为渐变是
  • pyQt Matplotlib 小部件实时数据更新

    使用 pyQt 4 8 5 在 Python 2 7 中编写 如何在 pyQt 中实时更新 Matplotlib 小部件 目前 我正在对数据进行采样 现在是 random gauss 附加此数据并进行绘图 您可以看到我每次都会清除该数字并为
  • 将具有多个键的字典按一个键求和的最有效方法是什么?

    我有以下字典结构 product1 product tmpl id product id qty product uom qty price price unit subtotal price subtotal total price to
  • 在appdomain中加载静态类

    我在 C AppDomain 中遇到了一个大问题 我需要在 dll 文件中加载静态类并执行其方法 当我尝试通过以下方式加载它们时 Assembly LoadFrom XXXXX XXXXX is the full path of dll d
  • Laravel 递归关系

    我正在做一个项目Laravel 我有一个可以有父母或可以有孩子的帐户模型 所以我的模型设置如下 public function immediateChildAccounts return this gt hasMany Account ac