Laravel 4,从多个postgresql-schemas中检索数据

时间:2013-12-16 21:19:53

标签: sql postgresql laravel-4

我正在使用Laravel 4开发一个项目,我使用的是postgres-db。 public-schema是admin的主要架构。所有其他自定义模式都适用于客户端。所有模式都具有相同的表设置。

但对于某些客户端,必须检索多个模式的数据。 L4有可能吗?或者我是否必须编写自定义查询?

这些是我对db-connection

的设置
'pgsql' => array(
        'driver'   => 'pgsql',
        'host'     => 'localhost',
        'database' => 'postgres',
        'username' => 'postgres',
        'password' => 'root',
        'charset'  => 'utf8',
        'prefix'   => '',
        'schema'   => 'public, client1, client2',
    ),

但是当我正在执行查询时:

$users = Users::all()
**OR**
$users = DB::select(DB::raw('SELECT * FROM client1.users, client2.users'));

我只是从公众中检索用户。 Laravel我有没有想念或不可能这样做?

提前致谢

3 个答案:

答案 0 :(得分:1)

与Laravel相当容易。

在你的配置中:

...

'pgsql2' => array(
    'driver'   => 'pgsql',
    'host'     => 'localhost',
    'database' => 'postgres',
    'username' => 'postgres',
    'password' => 'root',
    'charset'  => 'utf8',
    'prefix'   => '',
    'schema'   => 'client1',
),

...

在你的模特中:

// Define your second db connection
protected $connection = 'pgsql2';
// Define your table
protected $table = 'users';

如果没有对此进行测试,那么如果不起作用:

// Define your table
protected $table 'client1.users';

在您的模型中。

答案 1 :(得分:1)

您无需在配置中指定其他架构,请将其保留为public

你的查询错了 - 就是这样。这应该是这样的:

SELECT * FROM client1.users UNION ALL SELECT * FROM client2.users

此查询将从两个表中选择所有内容。您可以UNION ALL从表中选择所需数量。

您可能想要确定哪个用户在哪个架构中,因此只需在查询中添加标识符(变量):

SELECT 1 AS s, * FROM client1.users
UNION ALL
SELECT 2 AS s, * FROM client2.users
UNION ALL
SELECT 3 AS s, * FROM client3.users

输出如下:

| s | id | name   |
|---|----|--------|
| 1 | 1  | John   |
| 1 | 2  | Lucy   |
| 2 | 1  | Robert |
| 3 | 1  | Kelly  |
| 3 | 2  | Sam    |

答案 2 :(得分:0)

您需要使用

'schemas' => 'public, client1, client2'

如果要使用多个架构。

例如,当您使用来自不同架构的过程时。

如果要使用

'schema' => 'public, client1, client2'

它将选择列表中的第一个。