【问题标题】:Why my Eloquent all() return trash also?为什么我的 Eloquent all() 也返回垃圾?
【发布时间】:2016-05-26 05:30:24
【问题描述】:

您好,我有这样的代码 http://pastie.org/10852864 为什么当我调用路由时,我得到的结果是垃圾 http://prnt.sc/b8jxhh

但是当我更改为http://pastie.org/10852865 时,它按预期工作,没有垃圾。

但是第二个我需要到处写 config(...)。

【问题讨论】:

  • 垃圾是什么意思?
  • 您的 config/database.php 文件是否使用该数据库连接作为默认连接?
  • @geckob 第一个链接返回 Product::withTrashed()->get(); #Brett 不,我有 2 个连接。
  • @geckob 第一个链接 Product::all(),返回prnt.sc/b8jxhh 看看deleted_at,这不符合预期

标签: php laravel laravel-4 laravel-5 eloquent


【解决方案1】:

这里的问题是您没有运行父构造函数,因此不会应用任何特殊的 trait 方法 - 在这种情况下,bootSoftDeletes 方法将不会运行。

您只需要运行父构造函数。而不是:

public function __construct()
{
    config(['database.connections.pos.database' => 'mydata']);
}

你应该使用:

public function __construct()
{
    config(['database.connections.pos.database' => 'mydata']);
    parent::__construct();
}

【讨论】:

  • 谢谢哥们,我对 oop 知之甚少 ^_^
  • Branch::create(['name' => 'SuperMall']),然后我检查我的数据库是否有新记录,但名称为空,为什么?
  • @HataBomba 如果你有新的问题,问一个
  • 好的先生,无论如何,当我仅从“pos”连接创建模型时会发生这种情况,当 MyModel 使用默认连接时效果很好,所以我认为这仍然是相关的,好的,如果我会创建一个新的你认为需要吗?
【解决方案2】:

让我解释一下这条线的作用:

config(['database.connections.pos.database' => 'mydata']);

它实际上会转到config/database.php 并查找connections 数组并将pos.database 设置为mydata

数组如下所示:

'connections' => [

    'sqlite' => [
        'driver' => 'sqlite',
        'database' => env('DB_DATABASE', database_path('database.sqlite')),
        'prefix' => '',
    ],

    'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', 'localhost'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'charset' => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix' => '',
        'strict' => false,
        'engine' => null,
    ],

    'pgsql' => [
        'driver' => 'pgsql',
        'host' => env('DB_HOST', 'localhost'),
        'port' => env('DB_PORT', '5432'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'charset' => 'utf8',
        'prefix' => '',
        'schema' => 'public',
    ],

],

如您所见,大部分值取自.env 文件。您可以在 .env 中设置它,而不必使用您放置的行进行设置。

我的例子,在这种情况下,假设我使用MySQL,用户名和密码如下:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=freshbook
DB_USERNAME=root
DB_PASSWORD=password

已编辑

所以,如果你需要有两个连接,你实际上可以为两个不同的数据库创建两个控制器。

class MysqlController extends Controller
{
    public function __construct() {
      config(['database.connections.mysql.database' => 'mydata']);
      parent::__construct();


    }

    public function getSomething() {

    }
}

在 routes.php 中

Router::get('/get', function() {

   $user = App\User::find(1);

   if ($user-id == 1) {
      $ctrl = new App\Http\Controllers\MysqlController();

      return $ctrl->getSomething(); 

}

希望你能明白

【讨论】:

  • 是的,但我有 2 个连接 mysql 和 pos,每个客户都有不同的 DB_DATABASE,所以我使用 config(...) 更改 DB_DATABASE
  • 您的代码不会将 DB_DATABASE 更改为 mydata,仍然是默认伪造
  • @HataBomba 在构造中更改数据库后,您是否将路由映射到任何控制器方法?
  • 正如@marcin 所说,我忘记包含父构造
猜你喜欢
  • 2014-06-06
  • 1970-01-01
  • 2011-02-24
  • 2013-09-04
  • 1970-01-01
  • 2011-10-05
  • 2023-04-01
  • 2012-08-25
相关资源
最近更新 更多