使用 Laravel 或 PHP 在 mysql 表上建立条件关系

Make conditional relation on mysql tables using Laravel or PHP

我有 table 如下所示。

Table一个

id  | val_a
1   | a1
2   | a2
3   | a3

Table B

id  | id_a| val_b | resource_type
1   | 2   | b1    |  1
2   | 2   | b2    |  2
3   | 3   | b3    |  3
4   | 3   | b4    |  3

Table Resource_A

id  |r_val| id_b
1   | ra1 | 1

Table Resource_B

id  |r_val| id_b
1   | rb1 | 2

Table Resource_C

id  |r_val| id_b
1   | rc1 | 3
2   | rc2 | 4

如果resource_type在TableB中为1,则tableB与tableResource_A建立关系。

如果resource_type是TableB中的2,则tableB与tableResource_B建立关系。

如果resource_type是TableB中的3,则tableB与tableResource_C建立关系。

所需输出为:

id_b | id_a| val_b |val_a | resource_type| r_val
 1   | 2   | b1    |  a1  |    1         | ra1 
 2   | 2   | b2    |  a2  |    2         | rb1 
 3   | 3   | b3    |  a3  |    3         | rc1 
 4   | 3   | b4    |  a3  |    3         | rc2

但是在 laravel 中不使用循环获得它的最佳方法是什么?

如何使用 Laravel 5.2 OR Laravel 4 OR PHP OR MYSQL 查询来实现?

提前致谢。

您只需像我在下面所做的那样将 table 连接在一起。这里棘手的部分是从三个资源 table 中引入正确的 r_val。我们可以通过左连接到每个资源table,然后使用以下表达式来获取匹配值:

COALESCE(t1.r_val, t2.r_val, t3.r_val) AS r_val

这将从资源 table 中获取第一个非 NULL 值,顺序为从左到右。假设来自 tableb 的每个 ID 只出现一次,在其中一个资源 table 中,COALESCE() 中的术语顺序应该无关紧要。

SELECT tb.id AS id_b,
       tb.id_a,
       tb.val_b,
       COALESCE(ta.val_a, 'NA') AS val_a,
       tb.resource_type,
       COALESCE(t1.r_val, t2.r_val, t3.r_val) AS r_val
FROM tableb tb
LEFT JOIN tablea ta
    ON tb.id_a = ta.id
LEFT JOIN resource_a t1
    ON tb.id = t1.id_b
LEFT JOIN resource_b t2
    ON tb.id = t2.id_b
LEFT JOIN resource_c t3
    ON tb.id = t3.id_b

此处演示:

SQLFiddle