Laravel 5.2 中使用多个 MySQL 数据库连接查询关系存在

2024-06-07

我正在处理以下情况:我有两个模型,一个Employee with id and name字段和一个Telephone with id, employee_id and flag字段。还有一个一对多关系在这两种模型之间,即一个员工可能拥有多部电话,而一部电话可能属于单个员工。

class Employee extends Model
{
    public function telephones()
    {
        return $this->hasMany(Telephone::class);
    }
}



class Telephone extends Model
{
        public function employee()
    {
        return $this->belongsTo(Employee::class);
    }
}

The Employee模型引用表employees存在于名为的数据库模式中mydb1,而Telephone模型与一个相关telephones存在于名为的不同数据库模式中的表mydb2.

我想要的是仅获取员工与至少一部电话特定标志的急切加载,使用 Eloquent 并且(如果可能)不使用查询构建器

到目前为止我尝试过的without成功是:

1)在Controller中使用whereHas方法

$employees = Employee::whereHas('telephones', function ($query) {

    $query->where('flag', 1); //Fetch only the employees with telephones of flag=1

})->with([

    'telephones' => function ($query) { //Eager load only the telephones of flag=1

        $query->where('flag', 1);
    }

])->get();

我在这里尝试做的首先是仅检索拥有 flag=1 电话的员工,其次是仅急切加载这些电话,但我得到以下结果查询异常由于使用了不同的数据库连接:

未找到基表或视图:表 mydb1.telephones 不存在(这是真的,电话存在于 mydb2 中)

2) 控制器中带有约束的渴望加载

$employees = Employee::with([

    'telephones' => function ($query) {

        $query->where('flag', 1);
    },

])->get();

此方法急切地加载 flag=1 的电话,但它返回all员工实例,这不是我真正想要的。我想要一个集合仅具有电话的员工型号 with flag= 1,排除具有telephones = []


考虑在内这个帖子 https://stackoverflow.com/questions/14621943/laravel-how-to-use-where-conditions-for-relations-column, 这个帖子 https://softonsofa.com/tweaking-eloquent-relations-how-to-get-hasmany-relation-count-efficiently/和@Giedrius Kiršys 在下面的回答,我终于想出了一个适合我的需求的解决方案,使用以下步骤:

  1. 创建一个返回a的方法关系对象在模型中
  2. 急切加载控制器中的这种新关系
  3. 使用 a 过滤掉 flag != 1 的电话查询范围在模型中

In Employee model

/**
 * This is the new relationship
 *
 */
public function flaggedTelephones()
{
    return $this->telephones()
        ->where('flag', 1); //this will return a relation object
}



/**
 *  This is the query scope that filters the flagged telephones
 *
 *    This is the raw query performed:
 *    select * from mydb1.employees where exists (
 *    select * from mydb2.telephones
 *    where telephones.employee_id = employee.id
 *    and flag = 1);
 *
 */    
public function scopeHasFlaggedTelephones($query, $id)
{
    return $query->whereExists(function ($query) use ($id) {
        $query->select(DB::raw('*'))
            ->from('mydb2.telephones')
            ->where('telephones.flag', $flag)
            ->whereRaw('telephones.employee_id = employees.id');
    });
}

在控制器中

现在我可以使用 Eloquent 这种优雅的语法

$employees = Employee::with('flaggedTelephones')->hasFlaggedTelephones()->get();

读起来像“获取所有带有已标记电话的员工,然后只获取至少拥有一部标记电话的员工”

EDIT:

在处理 Laravel 框架一段时间后(当前版本使用 5.2.39),我想,事实上,whereHas()如果关系模型存在于不同的数据库中,则子句确实可以使用from()方法,如下图所示:

$employees = Employee::whereHas('telephones', function($query){

    $query->from('mydb2.telephones')->where('flag', 1);

})->get();

@Rob Contreras 声明了使用from()方法,但是看起来该方法需要将数据库和表作为参数。

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

Laravel 5.2 中使用多个 MySQL 数据库连接查询关系存在 的相关文章

  • Laravel /broadcasting/auth 总是失败并出现 403 错误

    我最近深入研究了 Laravel 5 3 的 Laravel Echo 和 Pusher 组合 我已成功建立公共频道并转向私人频道 我在 Laravel 从 broadcasting auth 路由返回 403 时遇到了麻烦 无论我做什么来
  • InnoDB vs. MyISAM 插入查询时间

    我有一个大型 MySQL 表 约 1000 万行 6 5G 用于读取和写入 它是MyISAM 由于MyISAM 的所有表写入锁 我获得了很多锁 我决定尝试迁移到 InnoDB 推荐用于读 写表 它只锁定写入时的特定行 转换后 我测试了插入语
  • 无法将代码优先迁移应用到 mysql 数据库

    我正在使用 EF 代码优先模型开发 asp net mvc 我正在尝试首先使用 EF 代码将迁移应用到我的项目中 我正在使用 MySql 数据库 目前我使用的是 EF 4 3 1 版本和 6 6 4 0 版本的 mysql Connecto
  • 当服务器时区不是 UTC 时,从 Java 中的 MySQL 检索 UTC DATETIME 字段

    我正在尝试编写代码以使用 Java 和 MySQL 与第三方开发的数据库进行互操作 该数据库有一个字段 用于存储时间戳DATETIME字段作为 UTC 日期 运行数据库和客户端的服务器的时区设置为非 UTC 时区 Europe London
  • 我是否应该标准化我的数据库?

    在设计数据库 例如 MySQL 的模式时 会出现是否完全规范化表的问题 一方面 连接 以及外键约束等 非常慢 另一方面 您会获得冗余数据和潜在的不一致 最后优化 是正确的方法吗 即创建一个按书本规范化的数据库 然后查看可以对哪些内容进行非规
  • 如何在 Eclipse 中使用 MySql 数据库

    我对编程非常陌生 所以请耐心等待 如果一开始我没有理解的话 请提前道歉 我正在做一个本科编程项目 需要在 Java 程序中创建一些数据库 我正在使用 eclipse galilo 来编写我的程序 我已经下载了一个连接器 J 但还不知道应该如
  • 在 Entity-Framework Core 中批量插入到 MySQL [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个由约 10 000 个对象组成的列表 比方说类Person 我需要将其插入到 MySQL 表中
  • 浏览器关闭后从数据库中删除

    我正在开发一个电子商务应用程序 但问题是 当用户将产品添加到购物车并在订购前关闭浏览器时 购物车会带走所有产品 所有购物车项目都保存在表中 如果用户关闭浏览器而不订购 我只想刷新购物车 您可以使用 Javascript 事件捕获浏览器关闭并
  • 有没有办法将应用程序上下文与非 Sybase DB 服务器中的数据库连接进行通信(类似于 Sybase 中的 set_appcontext)?

    Sybase 有一种让应用程序进行通信的方法 上下文 数据 http manuals sybase com onlinebooks group as asg1250e sag Generic BookTextView 38861 hf 0
  • 在带有 OR 条件的 LEFT JOIN 中使用索引

    考虑以下查询 SELECT FROM table1 LEFT JOIN table2 ON table2 some primary key table1 some primary key LEFT JOIN table3 ON table3
  • 将表与同一个表的前一条记录连接起来

    我有一个包含历史记录的表 由主表中的多个触发器发布到那里 我想在历史表上创建一个 select 语句 其中每个记录都由其先前的记录 由相同的 LineID 和最高的 ActionDate 标识 连接 这样我就可以提取这两者之间的差异 我尝试
  • MySQL 多个 IN 条件对同一个表进行子查询

    我有多个带有子查询的 IN 条件 SELECT S name S email FROM something S WHERE 1 NOT IN SELECT id FROM tags WHERE somethingId S id AND 2
  • PHP/MySQL:检索邻接列表模型中的单个路径

    有没有什么有效的方法可以在不限制深度的情况下根据节点的ID检索邻接列表模型中的单个路径 就像如果我有一个名为 Banana 的节点的 ID 我可以获得以下路径 Food gt Fruits gt Banana 如果不可能的话也不是什么大问题
  • mysql变量赋值:如何强制赋值顺序?

    由于mysql是一种声明性语言 我找不到强制赋值变量顺序的方法 采取这个查询 SET v1 0 SET v2 0 SELECT v1 v2 FROM MyTable table WHERE v1 v2 is not null AND v2
  • 使用 JOIN 和 UNION 合并不同表中的记录

    我需要创建一个查询来组合两个表中的数据 我认为可能是 JOIN 和 UNION 的组合 在此示例中 我需要列出状态处于活动状态的所有姓名 仅一次 并将他们的葡萄酒 苏打水 晚餐 甜点和水果偏好组合起来 按姓名排序 我不确定单独的 JOIN
  • SimpleSAMLPHP 重定向循环

    我们正在尝试使用自定义 mysql 数据库设置 sso 但它在以下两个请求之间进入无限循环 POST http 192 168 0 15 simplesaml module php core loginuserpass php 设置Cook
  • 我应该为 MySQL 使用什么 python 3 库? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 据我所知 MySQLdb 仍然没有移植到 Python 3 pypy 上似乎有另一个名为 PyMySQL
  • 无效的 PDO 查询不会返回错误

    下面的第二条 SQL 语句在 phpMyAdmin 中返回错误 SET num 2000040 INSERT INTO artikel artikel nr lieferant nr bezeichnung 1 bezeichnung 1
  • Laravel Socialite:项目中尚未使用 Legacy People API

    我在我的 Web 应用程序上使用 Laravel 5 4 和 Socialite 3 0 进行社交登录 但现在我遇到了一个错误旧版 People API 尚未在项目 xxx 中使用 然后我对socialite包的核心文件做了一些更改 ven
  • 左连接 SQL 求和

    我有两张桌子想要加入 比如说表 a 和表 b 表 b 有许多行指向表 a 表 b 包含价格 实际上是一个购物篮 所以我想要的是表a中的所有记录和表b中的价格之和 我努力了 select a sum b ach sell from booki

随机推荐

  • 如何获取 UIImage 的大小(以 KB 为单位)?

    有没有办法从 UIImage 获取以 KB 为单位的文件大小 而不从 didFinishPickingMediaWithInfo 获取该图像 所呈现的图像来自相册 我尝试了以下代码 但这给出了以下结果 图像大小 KB 0 000000 vo
  • 为什么我会得到以下结果? [复制]

    这个问题在这里已经有答案了 我做了以下测试 看看如何 PriorityBlockingQueue
  • 为什么在 Vim 的插入模式下粘贴长一行非常慢?

    昨天 当我尝试将 1200 行 每行 80 个字符 粘贴到 Vim 时 我的 Macbook 被卡住了 下载文件而不是粘贴文本要快得多 我认为这个问题可能是互联网运营商允许上传速度比下载速度慢的原因 如果您将其粘贴到终端窗口中 Vim 会认
  • 有没有办法在Ejabberd上用Strope实现“Message Seen”功能?

    我只是想知道是否有一个用于消息传递收据的 Strope 插件可以与 Ejabberd 一起使用 我想了解消息传递收据是如何工作的 Strope 是否有任何文档 插件 实现消息传递回执 http xmpp org extensions xep
  • 不和谐嵌入中的行分隔符/中断

    我有以下不和谐嵌入 message reply content embed color 11416728 author name xx know it all icon url https xx png description footer
  • 在 iOS 7 上需要具有非半透明栏的 WantsFullScreenLayout 行为

    我希望能够让我的视图覆盖整个屏幕 位于导航栏和工具栏后面 并将导航栏和工具栏的半透明属性设置为NO 我想要不透明的条 在 iOS 7 之前 这很容易通过设置来完成wantsFullScreenLayout是 然而 在 iOS 7 中 我找不
  • 将多对多关系与实体框架中的属性映射

    我总是使用属性将实体的属性映射到相应的列 这是一个例子 Table news entries public class News Key public int Id get set Column d date public DateTime
  • 用于 Mono 的 .NET Reflector [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Mono 是否有等效的 NET Reflector 快速谷歌搜索没有找到任何东西 或者我可以在 Mono 上运行 Reflector 例如
  • Quanteda 包,朴素贝叶斯:如何预测不同特征的测试数据?

    I used quanteda textmodel NB创建一个模型 将文本分类为两个类别之一 我将模型拟合到去年夏天的训练数据集上 现在 我今年夏天尝试使用它对我们在工作中收到的新文本进行分类 我尝试这样做并收到以下错误 Error in
  • C# usercontrol如何访问所有子控件

    我定义了一个自定义面板 里面有一个表格布局面板 但是 当我在 winform 上使用此控件时 我无法访问表布局面板属性 例如 我想在单元格中添加一列或停靠其他控件 我尝试将修饰符属性更改为public 但仍然不起作用 我该怎么做才能查看和更
  • 如何通过 HTML 表单创建 google 图片搜索的链接?

    尝试使用 HTML 表单制作 Google 图像搜索克隆 在搜索字段中输入文本后 它将直接带您进入 Google 图像搜索结果页面 这是我正在使用的代码
  • 64位版本的adb和fastboot?

    我在 Debian 7 3 x64 已完全修补 上发现了以下错误 我很确定这是因为adb即使在其 SDK 工具的 64 位发行版中也是 32 位 which adb opt android sdk platform tools adb op
  • 如何使用Bert进行长文本分类?

    我们知道 BERT 有 token 的最大长度限制 512 因此如果一篇文章的长度远大于 512 例如文本中有 10000 个 token 如何使用 BERT 您基本上有三个选择 您可以剪掉较长的文本并仅使用前 512 个令牌 最初的 BE
  • WCF 包装代理客户端

    我的项目中有许多在客户端应用程序中使用的 Web 方法 我不想写这样的代码 using ServiceClient sc new ServiceClient Invoke service methods sc Method1 相反 我想写
  • 从 NSString 中去除非字母数字字符

    我正在寻找一种快速简便的方法来从文本中删除非字母数字字符NSString 可能使用的东西NSCharacterSet 但我累了 似乎没有什么返回只包含字符串中字母数字字符的字符串 我们可以通过拆分然后合并来做到这一点 组件Separated
  • Android Marshmallow 应用程序中位置的权限问题

    我正在学习开发一个 Android 应用程序 用于按照 Google 开发者论坛获取设备位置 http developer android com training location retrieve current html last k
  • 如何使用PIL将灰度图转为伪彩色?

    我似乎不知道如何获取我的灰度函数并将其更改为给我假颜色 我知道我需要将每种颜色 R G B 分成范围 然后根据每种颜色的范围分配颜色 有谁知道这是如何运作的 def grayscale pic width height pic size f
  • 没有名为“torch”或“torch.C”的模块

    希望得到像我 5 这样的解释 因为我已经检查了所有相关答案 但没有一个有帮助 我已经安装了Python 我已经安装了Pycharm 我已经安装了Anaconda 我已经安装了 Microsoft Visual Studio 我有not安装了
  • 如何在不启动 Jupyter Notebook 服务器的情况下使用 .ipynb 文件?

    我开始更多地使用 Jupyter 笔记本 并且真的开始喜欢它 但是 我发现很难在我的特定设置中使用它 我有一个工作站来运行所有笔记本电脑 但一天中的大部分时间我都在使用空间有限且没有电源插座的笔记本电脑 我希望能够编辑 但不能运行 这些笔记
  • Laravel 5.2 中使用多个 MySQL 数据库连接查询关系存在

    我正在处理以下情况 我有两个模型 一个Employee with id and name字段和一个Telephone with id employee id and flag字段 还有一个一对多关系在这两种模型之间 即一个员工可能拥有多部电