Что не так с вложенным запросом?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
user
Сообщения: 159
Зарегистрирован: 2017.12.05, 16:55

Что не так с вложенным запросом?

Сообщение user »

Есть:

Код: Выделить всё

public function getRequirement()
    {
        $guid = new Expression('RIGHT (CONVERT(CHAR(34), _IDRRef, 1), 32) ');
        $date = new Expression('DATEDIFF(s, \'1970-01-01 00:00:00\', CONVERT(VARCHAR, (DATEADD (yyyy, -2000, _Date_Time)), 20))');
        $model = Requirement::find()
            ->select([
                '_IDRRef' => $guid,
                '_Date_Time' => $date,
                '_Number',
                '_Fld10440'
            ])
            ->joinWith('document255VT4740')
            ->andWhere(['_Fld4701RRef' => new Expression('CONVERT(binary(16), ' . $this->status . ' ,1)')])
            ->andWhere(['_Posted' =>  new Expression('CONVERT(binary(1), ' . $this->posted . ' ,1)') ])
            ->all();

        return $model;
    }

    public function getDocument255VT4740()
    {
        return $this->hasMany(Document255VT4740::className(), ['_Document255_IDRRef' => '_IDRRef']);
    }
Отрабатывает без ошибок, но _Fld10440 не возвращается :(
делал document255VT4740._Fld10440
пишет
"[Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Не удалось привязать составной идентификатор \"document255VT4740._Fld10440\"."
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Что не так с вложенным запросом?

Сообщение Alexum »

Используя поисковые методы модели AR стоит помнить, что Yii из результата основного запроса загрузит в неё (в модель, для которой вызывался find()) ТОЛЬКО её атрибуты и дополнительными запросами получает связанные объекты (если использовались связи with(), joinWith() и т.п.). Ему всё равно что вы ещё там в основной select надобавляли (пусть и запрос при этом выполнится корректно). Поле _Fld10440 доставайте через связь. Если нужно только это поле, можно в связи прописать:

Код: Выделить всё

->select([
                '_IDRRef' => $guid,
                '_Date_Time' => $date,
                '_Number',
            ])
->joinWith(['document255VT4740' => function($q){
	$q->select('_Fld10440');
}])

PS. А то, что вы через точку указали связь и поле - непосредственно в запросах так можно последовательности связей указывать, а у вас поле.
user
Сообщения: 159
Зарегистрирован: 2017.12.05, 16:55

Re: Что не так с вложенным запросом?

Сообщение user »

спасибо, не сработало, там будет много связей порядка 8 таблиц :(

Код: Выделить всё

    public function getRequirement()
    {
        $guid = new Expression('RIGHT (CONVERT(CHAR(34), _IDRRef, 1), 32) ');
        $date = new Expression('DATEDIFF(s, \'1970-01-01 00:00:00\', CONVERT(VARCHAR, (DATEADD (yyyy, -2000, _Date_Time)), 20))');
        $model = Requirement::find()
            ->select([
                '_IDRRef' => $guid,
                '_Date_Time' => $date,
                '_Number'
            ])
            ->joinWith(['document255VT4740' => function($q){
                $q->select(['_Fld10440']);
            }])
            ->andWhere(['_Fld4701RRef' => new Expression('CONVERT(binary(16), ' . $this->status . ' ,1)')])
            ->andWhere(['_Posted' =>  new Expression('CONVERT(binary(1), ' . $this->posted . ' ,1)') ])
            ->all();

        return $model;
    }

    public function getDocument255VT4740()
    {
        return $this->hasMany(Document255VT4740::className(), ['_Document255_IDRRef' => '_IDRRef']);
    }
возвращает все равно:
[
{
"_IDRRef": "80C500155D00371F11E8E3F4059C7BAD",
"_Date_Time": "1541766569",
"_Number": "ГХ000000021"
}
]
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Что не так с вложенным запросом?

Сообщение Alexum »

Вы результат чего показываете? Нужного вам поля не будет в модели Requirement. Оно у объектов, доступных через связь. Н-р: $model->document255VT4740[0]->_Fld10440
user
Сообщения: 159
Зарегистрирован: 2017.12.05, 16:55

Re: Что не так с вложенным запросом?

Сообщение user »

Alexum писал(а): 2018.11.13, 14:12 Вы результат чего показываете? Нужного вам поля не будет в модели Requirement. Оно у объектов, доступных через связь. Н-р: $model->document255VT4740[0]->_Fld10440
тогда я ничего не понимаю, смысл тогда ActiveRecord и связей в нем?
[_oldAttributes:yii\db\BaseActiveRecord:private] => Array
(
[_IDRRef] => 80C500155D00371F11E8DCE5EE7CE7E4
[_Date_Time] => 1541009809
[_Number] => СТ000000046
)

[_related:yii\db\BaseActiveRecord:private] => Array
(
[document255VT4740] => Array
(
)

)
он ничего не выбирает
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Что не так с вложенным запросом?

Сообщение andku83 »

user писал(а): 2018.11.13, 11:27

Код: Выделить всё

            ->select([
                '_IDRRef' => $guid,
                '_Date_Time' => $date,
                '_Number',
                '_Fld10440'
            ])
Если вам не нужны объекты то можно использовать массивы тогда там будут все запрошенные поля:

Код: Выделить всё

	...
	->asArray()->all()
---------------------------------------------------
Если же все-таки нужен объект, то в классе можно объявить:

Код: Выделить всё

class Requirement extends ActiveRecord
{
	public $_IDRRef;
	public $_Date_Time;
	public $_Number;
	public $_Fld10440;
}
и тогда данные из результата будут загружены в эти атрибуты.
user
Сообщения: 159
Зарегистрирован: 2017.12.05, 16:55

Re: Что не так с вложенным запросом?

Сообщение user »

Я использовал DAO но проблема в том, что он все данные возвращают в виде строки, но мне нужны корректные данные, если это число, чтобы он отдавал число, поэтому я решил использовать AR, т.к. он по идее должен корректно вернуть данные, но что-то тут не так )))
DAO возвращает:
{
"guidRequirement": "80C500155D00371F11E8DCE5EE7CE7E4",
"numberRequirement": "СТ000000046",
"dateRequirement": "1541009809",
"priceRequirement": "3250.00",
"volumeRequirement": "1000.00",
},
А мне надо
{
"guidRequirement": "80C500155D00371F11E8DCE5EE7CE7E4",
"numberRequirement": "СТ000000046",
"dateRequirement": 1541009809,
"priceRequirement": 3250.00,
"volumeRequirement": 1000.00,
},
Можно конечно пересобрать массив
или использовать filds
Ответить