【问题标题】:Written row has all default values (null, 0, etc.)写入的行具有所有默认值(null、0 等)
【发布时间】:2015-10-09 21:36:12
【问题描述】:

我正在使用 Laravel 5.1 并尝试将一行插入到通过 SSH 隧道连接的远程数据库中,并且读取正常。我有一个本地数据库和各种远程数据库。这段代码曾经可以工作,我只是在 DigitalOcean 中克隆了我的 droplet,以便它指向另一个远程数据库,然后问题就出现了。

当我创建远程 Promotion 时,我得到了一个主键 ID,但是当我读回它并在 MySQL Workbench 上检查它时,所有字段都有默认值,主要是 NULL0。知道发生了什么吗?

以下配置适用于我正在尝试写入的远程数据库。

数据库配置

'prod' => [
    'read'      => [
        'options' => [
            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET time_zone = \'-04:00\''
            ]
    ],
    'write'     => [],
    'driver'    => 'mysql',
    'host'      => env('PROD_DB_HOST', 'localhost'),
    'port'      => env('PROD_DB_PORT', '3306'),
    'database'  => env('PROD_DB_DATABASE', 'forge'),
    'username'  => env('PROD_DB_USERNAME', 'forge'),
    'password'  => env('PROD_DB_PASSWORD', ''),
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
    'strict'    => false,
],

型号

<?php

namespace App\Models\Remote;

use Illuminate\Database\Eloquent\Model;

class Promotion extends Model
{
    protected $connection = null;
    protected $table = 'Tournament';
    protected $primaryKey = 'tournamentId';
    protected $guarded = ['tournamentId'];
    public $timestamps = false;

    public function __construct()
    {
        $this->connection = env('APP_ENV');
    }

    public function gameplayLogs()
    {
        return $this->hasMany('GamePlayLog', 'tournamentId');
    }

    public function scopeActive($query)
    {
        return $query->where('status', 3);
    }
}

** 创造 **

public function deployPromotionMain($id)
{
    $post = json_decode(file_get_contents("php://input"), true);
    $today = date('Y-m-d H:i:s');
    $promo = \Promotion::with(['assets'])->find($id);

    $data = [
        'name'                      => $promo->name,
        'description'               => $promo->description,
        'gameId'                    => intval($promo->gameId),
        'categoryId'                => intval($promo->categoryId),
        'subCategoryId'             => intval($promo->subCategoryId),
        'advertiserId'              => $promo->advertiserId,
        'advertiserCost'            => 0,
        'gamePlays'                 => $promo->gamePlays,
        'promoStartDate'            => '2015-01-01 00:00:00',
        'promoEndDate'              => '2015-01-02 00:00:00',
        'createdDate'               => $today,
        'updatedDate'               => $today,
        'promoFileDuration'         => 0,
        'eventStartDate'            => $promo->promoStartDate,
        'eventEndDate'              => $promo->promoEndDate,
        'eventStartTime'            => '0:00 AM',
        'eventEndTime'              => '11:00 PM',
        'minPlays'                  => 1,
        'maxPlays'                  => 0,
        'minAge'                    => 18,
        'maxAge'                    => 0,
        'scoringId'                 => 1,
        'minLevel'                  => 1,
        'maxLevel'                  => 0,
        'tournamentDifficultyId'    => 1,
        'timeId'                    => 1,
        'timeOut'                   => 15,
        'defaultPrice'              => 0,
        'limitGames'                => 1,
        'distributorId'             => 0,
        'stateId'                   => 0,
        'locationTypeId'            => 0,
        'questionSetId'             => 0,
        'status'                    => 3,
        'sendEmail'                 => 1,
        'kioskModelId'              => 2,
        'triviaCategoryId'          => 1,
        'duration'                  => 0
    ];

    foreach ($promo->assets as $a) {

        switch($a['assetTypeId']) {

            case 1:
                $data['eventFilePath'] = 'uploadfiles/tournament/event/'.$a['assetName'];
                $data['promoFilePath'] = 'uploadfiles/tournament/promo/'.$a['assetName'];
                break;
            case 2:
                $data['imageFilePath'] = 'uploadfiles/tournament/image/'.$a['assetName'];
                $data['thumbnailFilePath'] = 'uploadfiles/tournament/image/'.$a['assetName'];
                break;
            case 3:
                $data['iconFilePath'] = 'uploadfiles/tournament/icon/'.$a['assetName'];
                break;
            case 7:
                $data['ruleFilePath'] = 'uploadfiles/tournament/rule/'.$a['assetName'];
                break;
            default:
                break;
        }
    }

    foreach ($post['env'] as $env) {

        if ($env == 'dev') {

            $dev_promo = \PromotionRemote::create($data);

... //At this point I dumped $data and it had the right values but the entry had all null's and 0's and whatnot.

注意:\Promotion:: 是本地数据库的推广,我基本上是复制到远程数据库。

【问题讨论】:

  • 你能把这段代码粘贴到你实际创建并保存对象的地方吗?加上DefaultRemote的代码
  • 谢谢。 “此时我转储了 $data 并且它具有正确的值” - 如果在这个阶段一切正常,那么在以后的阶段有些东西被破坏了。你也可以粘贴 PromotionRemote 吗?

标签: php mysql laravel eloquent


【解决方案1】:

这成功了:

class Promotion extends Model
{
    ...

    public function __construct($attributes = [])
    {
        parent::__construct($attributes);        

        $this->connection = env('APP_ENV');
    }

    ...
}

因为我的类上有一个扩展 Eloquent 的 Model 的构造函数,所以在我做任何事情之前我还需要调用 Model 的构造函数。

【讨论】:

  • 请注意,重写 Laravel 的模型构造函数可能不是最好的事情。由于雄辩的 Model 类是从 Laravel 派生的,如果他们更新了构造函数参数并且您执行了 composer update 这将破坏您的模型。我会亲自覆盖模型boot() 方法并在那里设置您的动态连接。
  • 感谢您的提醒,举个例子就好了。创建一个父类而不是扩展 Model 并在构造函数中建立连接怎么样,所以我只有 1 个构造函数。然后从那个新的类中扩展像Promotion 这样的所有类?
猜你喜欢
  • 2014-11-19
  • 2019-08-17
  • 2017-03-14
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多