5

在 Laravel 3 中,我可以在运行时设置数据库“获取”配置(以数组而不是对象的形式获取结果):

Config::set('database.fetch', PDO::FETCH_ASSOC);

在 Laravel 4 中,结果仍然作为对象返回。

我究竟做错了什么?

[编辑 - 额外细节]

我决定测试是否设置了配置,并在 Laravel 3 和 Laravel 4 中并排尝试相同的代码段。

//first fetch as object
Config::set('database.fetch', PDO::FETCH_CLASS);
//Laravel 3 and 4 returns 88 ... expected:
echo PDO::FETCH_CLASS.Config::get('database.fetch');
$users = $users = DB::table('users')->get();
//Laravel 3 and 4 both return an array of objects(stdClass) ... expected
var_dump($users);

//then fetch as array
Config::set('database.fetch', PDO::FETCH_ASSOC);
//Laravel 3 and 4 returns 22 ... expected:
echo PDO::FETCH_ASSOC.Config::get('database.fetch');
$users = $users = DB::table('users')->get();
//Laravel 3 returns an array of arrays ... expected
//Laravel 4 returns an array of objects(stdClass) ... UNEXPECTED!
var_dump($users);
4

3 回答 3

18

TL;DR:不要将配置用于运行时更改

配置集仅在初始化时获取模式。这通常适用于所有 Illuminate 库。

如果您需要在运行时更改获取模式,则需要在连接对象上而不是在配置中进行设置。

幸运的是,我们可以访问连接对象。

请注意,该Connection对象有一个setFetchMode()方法。

直接使用连接对象

这意味着在您的代码中,您可以获得连接,然后setFetchMode(PDO::FETCH_ASSOC)在查询数据库之前使用它运行。

// With Query Builder
$query = DB::connection()->setFetchMode(PDO::FETCH_ASSOC);

// With Eloquent model
$user = new User;
$user->getConnection()->setFetchMode(PDO::FETCH_ASSOC);
于 2013-10-14T21:31:20.070 回答
3

这没有什么问题

Config::set('database.fetch', PDO::FETCH_ASSOC);

它应该可以工作,并且可以在我的本地服务器上工作。如果由于某种原因它不起作用,那么您可以使用另一种方法来实现相同的结果,即

function stdToArray($obj)
{
    if (is_object($obj)) {
        $obj = get_object_vars($obj);
    }
    if (is_array($obj)) {
        return array_map(__FUNCTION__, $obj);
    }
    else {
        return $obj;
    }
}

如果你把这个函数filter.php作为一个辅助函数放在你的文件中,那么你可以在你app喜欢的任何地方使用它

$users = DB::table('users')->get();
dd(stdToArray($users));

结果将是一个数组数组,但Config::set('database.fetch', PDO::FETCH_ASSOC);应该可以工作,我已经在我的本地服务器上检查过,它工作得很好。

更新:(更好的是,将对象数组转换为数组数组)

$users = DB::table('users')->get();
$users = json_decode(json_encode($users), true);
dd($users); // an array of arrays

更新:为什么它可以在我的本地服务器上运行,但不能在我OP的服务器上运行,这里是:(感谢 fideloper

// I have this query at first
$users = DB::table('users')->get();

然后我跟着

Config::set('database.fetch', PDO::FETCH_ASSOC);
$users = DB::table('users')->get();
dd($users); // expected an array of arrays but it was objects

但是,如果我只是删除第一个,db query那么它就可以正常工作

// $users = DB::table('users')->get();
Config::set('database.fetch', PDO::FETCH_ASSOC);
$users = DB::table('users')->get();
dd($users); // expected an array of arrays and I get it

因此,这意味着一旦您进行查询然后使用Config::set(...),它不会更改获取模式,因为连接已经建立并且可以进一步使用。所以,这可能是这样的情况,它不工作Config::set(...);,你可能已经建立了连接/查询。因此,解决方案是fideloper 的答案

DB::connection()->setFetchMode(PDO::FETCH_ASSOC);
$users = DB::table('users')->get();
dd($users); // an array of arrays

功劳归于fideloper

于 2013-10-14T15:57:43.300 回答
-1

不确定,但也许这样的工作。

$config = Config::set('database.fetch', PDO::FETCH_ASSOC);
$config->toArray();
于 2013-10-14T13:11:38.087 回答