Yii2: ΠŸΡƒΡΡ‚ΠΎΠΉ массив Π² JsonExpression

Created on 5 Mar 2018  Β·  13Comments  Β·  Source: yiisoft/yii2

PostgreSQL ΠΏΡ€ΠΈ записи new \yii\db\JsonExpression([],'json') оТидаСтся '{}::json', вмСсто этого Π² Π‘Π” записываСтся []

| Yii version | 2.0.14
| PHP version | 5.6
| Operating system | Debian

under discussion

Most helpful comment

$attributes['var'] = new stdclass();

All 13 comments

Thanks for posting in our issue tracker.
In order to properly assist you, we need additional information:

  • When does the issue occur?
  • What do you see?
  • What was the expected result?
  • Can you supply us with a stacktrace? (optional)
  • Do you have exact code to reproduce it? Maybe a PHPUnit tests that fails? (optional)

Thanks!

_This is an automated comment, triggered by adding the label status:need more info._

Как записываСтС, какая вСрсия постгрСса, ΠΊΠ°ΠΊΠΎΠΉ Ρ‚ΠΈΠΏ столбца?

Насколько я понимаю, Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ содСрТимоС JsonExpression ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, Π° Π½Π΅ массиву?

PostgreSQL 9.6
ΠŸΡ€ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΈ значСния

$attributes['id'] = 210;
$attributes['steps'] = '';
$attributes['var'] = [];

Π² Π±Π°Π·Ρƒ ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ строка {"id":210,"steps":"","var":[]}
Π΄ΡƒΠΌΠ°ΡŽ Ρ‡Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π΅Π΅ Π±ΡƒΠ΄Π΅Ρ‚ {"id":210,"steps":"","var":{}}

Понял. @samdark @sergeymakinen ΠΊΠ°ΠΊ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅, ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ JSON_FORCE_OBJECT ΠΏΡ€ΠΈ json_encode() Π² ArrayExpressionBuilder'e?

Π² JsonExpressionBuilder'e ?
Π² ArrayExpression прСобразуСтся ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ [] => {}

$attributes['var'] = new stdclass();

@SilverFire ΠΌΠ½Π΅ каТСтся, Π½Π°Π΄ΠΎ ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π² Builder (ΠΈΠ½Π°Ρ‡Π΅ всСгда Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚Π΅, ΠΊΠΎΠΌΡƒ Π½Π°Π΄ΠΎ массив ΠΈ Ρ‚Π΅, ΠΊΠΎΠΌΡƒ Π½ΡƒΠΆΠ΅Π½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚), ΠΈΠ»ΠΈ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ классичСский ΠΎΡ‚Π²Π΅Ρ‚ ΠΎΡ‚ @cebe.
Π― Π±Ρ‹ оставил ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ ΠΈ посмотрСл спрос Π½Π° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€.

БозданиС новой записи в модСли

public function actionCreate($id) {
        $model = new ModelName([
            'id' => $id,
            'var' => new \yii\db\JsonExpression((new \stdClass()), 'json'),
        ]);
        if (isset($post['ModelName']['var'])) {
            $post['ModelName']['var'] = new \yii\db\JsonExpression($post['ModelName']['var'], 'json');
        }
        .....
        $model->load($post)
        $model->save()
}

запись истории

    public function afterSave($insert, $changedAttributes) {
        self::writeHistory($this->tableName(), $insert ? 'insert' : 'update', $this->getAttributes(), $changedAttributes);
        return parent::afterSave($insert, $changedAttributes);
    }
    public function afterDelete() {
        self::writeHistory($this->tableName(), 'delete', $this->getAttributes());
        return parent::afterDelete();
    }



md5-1685c6b52513ddc1baf38a56c61b8ce3



    public static function writeHistory($table_name, $action, $attributes, $changedAttributes = null) {
        $id = $attributes['id'];
        unset($attributes['id']);
        if (gettype($attributes['var']) == 'object') {
            $attributes['var'] = $attributes['var']->getValue(); 
        }
        \app\models\ModelHistory::writeHistory($id, $attributes, $changedAttributes, $table_name, $action);
    }

Допустим new stdΠ‘lass(); ΠΏΡ€ΠΈ записи Π² Π‘Π” устраиваСт
Ρ‚ΠΎΠ³Π΄Π° ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ с PostgreSQL {} Π² Yii получаСтся Π½Π΅ пустой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π° пустой массив [] (ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π½Π΅ΠΈΠΈ записи с {"var":{}}) ?

Π”Π°ΠΉΡ‚Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.

Ρ‚ΠΎΠ³Π΄Π° ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ с PostgreSQL {} Π² Yii получаСтся Π½Π΅ пустой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π° пустой массив [] (ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π½Π΅ΠΈΠΈ записи с {"var":{}}) ?

БСйчас JSON дСкодируСтся Π² массив. Π’ PHP Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ JSON Π»ΠΈΠ±ΠΎ Π² массив, Π»ΠΈΠ±ΠΎ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса \stdClass. НСльзя частично Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ JSON Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π° частично – в массив.

Π§Ρ‚ΠΎ касаСтся ΠΎΠ±Ρ‰Π΅Π³ΠΎ процСсса дСкодирования, Ρ‚ΠΎ ΠΏΡ€ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π² массив, JSON {} ΠΈ [] Π΄Π°Ρ‘Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Π½Π°Π΄ΠΎ ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π² Builder (ΠΈΠ½Π°Ρ‡Π΅ всСгда Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚Π΅, ΠΊΠΎΠΌΡƒ Π½Π°Π΄ΠΎ массив ΠΈ Ρ‚Π΅, ΠΊΠΎΠΌΡƒ Π½ΡƒΠΆΠ΅Π½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚)

Π‘ΠΈΠ»Π΄Π΅Ρ€ β€“Β ΡΠ»ΠΈΡˆΠΊΠΎΠΌ ΠΎΠ±Ρ‰Π΅. Π’Π°ΠΊΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ, Π° Π»ΡƒΡ‡ΡˆΠ΅ – схСмы.

@Tigrov Ρƒ вас Π±Ρ‹Π»ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ запросы?

Пока ΠΏΠ΅Ρ€Π΅Π½ΠΎΡˆΡƒ Π½Π° 2.0.15

@SilverFire запросов Π½Π΅ Π±Ρ‹Π»ΠΎ, Π½ΠΎ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ самому с этим ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Ρ‚ΡŒΡΡ.

Ρ‚ΠΎΠ³Π΄Π° ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ с PostgreSQL {} Π² Yii получаСтся Π½Π΅ пустой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π° пустой массив []

Вопрос Π² Ρ‚ΠΎΠΌ, ΠΊΠΎΠΌΡƒ ΠΊΠ°ΠΊ большС нравится ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ JSON Π² PHP. Как ассоциативный массив ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (с массивом Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‰Π΅).

@cebe Π²Ρ‹ΡˆΠ΅ Π΄Π°Π» Ρ€Π°Π±ΠΎΡ‡Π΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ³Π΄Π° Π² Π‘Π” Π½ΡƒΠΆΠ΅Π½ ΠΈΠΌΠ΅Π½Π½ΠΎ {}. Но Π² PHP Π±ΡƒΠ΄Π΅Ρ‚ всё Ρ‚ΠΎΡ‚ ΠΆΠ΅ массив.

Π‘Ρ‹Π²Π°ΡŽΡ‚ случаи, ΠΊΠΎΠ³Π΄Π° JSON Π½ΡƒΠΆΠ΅Π½ Π½Π΅ Π² PHP, Π° Π² JavaScript. Π—Π΄Π΅ΡΡŒ Ρ‚Π΅ самыС отличия {} ΠΈΠ»ΠΈ []. Π’ этих случаях ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ массив ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ.

@Krakozaber Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π² вашСм случаС ΠΏΡ€ΠΎΡ‰Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ null вмСсто пустого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°/массива.
Если интСрСсно Ρƒ мСня Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ https://github.com/Tigrov/yii2-pgsql-audit

Π—Π°ΠΊΡ€Ρ‹Π²Π°ΡŽ Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ любоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π°ΠΉΠ΄Ρ‘Ρ‚ ΠΊΠ°ΠΊ сторонников, Ρ‚Π°ΠΊ ΠΈ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΠΎΠ² + Π΅ΡΡ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ локального Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

skcn022 picture skcn022  Β·  3Comments

indicalabs picture indicalabs  Β·  3Comments

AstRonin picture AstRonin  Β·  3Comments

Kolyunya picture Kolyunya  Β·  3Comments

chaintng picture chaintng  Β·  3Comments