【问题标题】:Laravel 4 - set database.fetch config at runtimeLaravel 4 - 在运行时设置 database.fetch 配置
【发布时间】:2014-09-05 23:38:35
【问题描述】:

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

【问题讨论】:

  • 为什么不能修改 app/config/database.php 并在那里调整 fetch 样式?
  • 因为我只需要为我的应用程序中的某些方法动态更改设置(少数方法需要返回数组,但大多数应用程序需要返回对象)。
  • @MMacdonald 在那种情况下, toArray() 不是你想要的吗? laravel.com/docs/eloquent#collections
  • 不是 toArray() 仅适用于 Eloquent 吗?这些方法仅使用查询生成器。在 Laravel 3 中可以动态设置 fetch。
  • 如果从config/database.php文件中设置会得到什么,检查一下。

标签: php laravel laravel-4


【解决方案1】:

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

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

如果您需要在 run-time 中更改 fetch-mode,则需要在连接对象上而不是在配置中进行设置。

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

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

【讨论】:

  • @fideloper - 谢谢。 Taylor 在my Github ticket 中提到,database.fetch 将来会被弃用。在Laravel forums 中也对此进行了介绍。
  • 您可能希望在获取所需的数组后将获取模式设置回PDO::FETCH_CLASS$query = DB::connection()->setFetchMode(PDO::FETCH_CLASS);
  • 2021 年仅供参考,此方法在 Connection 类中不再公开,因此会引发异常。
【解决方案2】:

这没什么问题

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

【讨论】:

  • 你也可以只做$users = (array)DB::table('users')->get(); - php.net/manual/en/language.types.type-juggling.php
  • @RecoveringSince2003 谢谢 - 赞成。在接受答案之前,我想调试一下为什么官方方法在我的服务器上不起作用。
  • @ceejayoz,谢谢,但它会将数组的每个对象转换为数组吗?也许不是,但现在让我检查一下。
  • @MMacdonald,我很感激,你对调试的看法是对的,你应该找出它为什么不起作用。
  • @RecoveringSince2003 - 谢谢。 Taylor 在my Github ticket 中提到,database.fetch 将来会被弃用。在Laravel forums 中也对此进行了介绍。
【解决方案3】:

不确定,但也许这样的东西有效。

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

【讨论】:

  • 我并没有真正关注。这与我发布的配置有何不同?对我来说,它只是返回一个异常:“在非对象上调用成员函数 toArray()”
猜你喜欢
  • 2020-06-12
  • 2013-03-14
  • 2012-06-30
  • 2022-01-13
  • 2015-09-05
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多