【发布时间】:2021-01-21 15:30:33
【问题描述】:
这就是我得到的。我们使用Illuminate\Database\Eloquent\Builder 在 Postgres 中构建物化视图
本质上是三个表,我们通过加入订阅表和电子邮件表来构建电子邮件列表,然后我们得到订阅者电子邮件的电子邮件列表。
此时,我们有了第三张表,里面有三样东西。
Variable_ID | Email | Value
预期的行为是用户选择一个变量(例如地址),然后输入一个值,然后我们根据该值匹配值。因此,我们使用该订阅/电子邮件连接表,并比较变量/电子邮件/值表并找到匹配项。
问题在于说我想这样做:
$subscriptions->leftJoin('faker_email_var_table', 'faker_email_var_table'.'.email', '=', 'emails.email') ->select('faker_email_var_table'.'.email') ->where('variable_id', '1002015')->where('value', '=', '1234 Anywhere street') ->where('variable_id', '1002707')->where('value', '=', 'Smith')
这行不通。 因为我需要匹配 variable_id: 1002015 AND value: 1234 Anywhere street 然后我需要匹配 variable_id: 1002707 AND value: Smith
在 SQL 编辑器中起作用的是 INTERSECT。
SELECT var_Email_Val_Table.email
FROM backend.subscriptions
JOIN backend.emails ON subscriptions.email_id = emails.id
LEFT JOIN backend.var_Email_Val_Table ON var_Email_Val_Table.email::text = emails.email
WHERE var_Email_Val_Table.variable_id = 1002015 AND var_Email_Val_Table.value::text = '1234 Anywhere street'::text
INTERSECT
SELECT var_Email_Val_Table.email from backend.var_Email_Val_Table
WHERE var_Email_Val_Table.variable_id = 1002707 AND
var_Email_Val_Table.value::text = 'Rhodes'::text
INTERSECT
SELECT var_Email_Val_Table.email from backend.var_Email_Val_Table
WHERE var_Email_Val_Table.variable_id = 1002706 AND var_Email_Val_Table.value::text = 'Engineer'::text
但是,当我尝试这样的事情时:
$subscriptions->leftJoin(var_Email_Val_Table, var_Email_Val_Table.'.email', '=', 'emails.email')
->select(var_Email_Val_Table.'.email')
->where('variable_id', '1002015')->where('value', '=', '1234 Anywhere street')
->intersect(DB::table(var_Email_Val_Table)->select(var_Email_Val_Table.'.email')
->where('variable_id', '1002707')->where('value', '=', 'Smith'));
我收到此错误:
Call to undefined method Illuminate\\Database\\Eloquent\\Builder::intersect()
如果这是 php,我可以执行一系列 IF 条件来获得我的结果,但这不是 SQL 中的事情。
因此,如果有人可以帮助我了解如何在不使用集合的情况下 Eloquent INTERSECT,那就太好了!
感谢 Stack Fam!
【问题讨论】:
标签: php laravel postgresql eloquent