Laravel 4 - 在运行时设置database.fetch配置

时间:2013-10-14 13:05:13

标签: php laravel laravel-4

在Laravel 3中,我可以在运行时设置数据库'fetch'配置(将结果作为数组而不是对象获取):

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);

3 个答案:

答案 0 :(得分:16)

TL; DR:不要使用config进行运行时更改

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

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

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

请注意,Connection对象具有setFetchMode()方法。

直接使用连接对象

这意味着在您的代码中,您可以get your connection然后在查询数据库之前运行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);

答案 1 :(得分: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's answer

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

信用转到fideloper

答案 2 :(得分:-1)

不确定,但也许这样的事情有效。

$config = Config::set('database.fetch', PDO::FETCH_ASSOC);
$config->toArray();