изменение поля при выборке

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
kutuev93
Сообщения: 75
Зарегистрирован: 2016.01.24, 18:15
Откуда: Тюмень

Re: изменение поля при выборке

Сообщение kutuev93 »

Евгений Емельянов писал(а):

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

$query->orderBy(['points' => SORT_DESC]);
$models = $query->all();

var_dump($models);
 
Вы же результат выборки никуда не передали...
Евгений, да, вы были правы. Спасибо! Я видимо чего-то базового не понимаю.
Я думал, что по сути $query при all() как раз и возвращает результат выборки - массив данных
Теперь я вижу значение моего поля равное 50!
Если не сложно, помогите разобраться тогда с путаницей в 3 соснах:
По сути $models = $query->all(); просто передача значения из одной переменной в другую. Ведь тип одной ($models) и другой ($query->all()) переменной должен зависеть от возвращаемого типа all(). Я не прав?
И в конце вопрос: как мне передать данную модель в дата провайдер, если теперь у нас результат выборки, а не query
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: изменение поля при выборке

Сообщение zelenin »

$query - это по сути построитель запроса (объект ActiveQuery). Вы добавляете к запросу условия и в конце ВЫПОЛНЯЕТЕ построенный запрос, добавляя all()/one(). После выполнения $query->all() возвращается массив объектов ActiveRecord, после $query->one() - один объект ActiveRecord.

Какую данную модель? В конце у вас возвращается МАССИВ моделей, вы же выполняете all().

ActiveDataProvider - по сути это $query, к которому при выборке в гриде добавится all(), вы правы. Для массива есть ArrayDataProvider.
kutuev93
Сообщения: 75
Зарегистрирован: 2016.01.24, 18:15
Откуда: Тюмень

Re: изменение поля при выборке

Сообщение kutuev93 »

zelenin писал(а):$query - это по сути построитель запроса (объект ActiveQuery). Вы добавляете к запросу условия и в конце ВЫПОЛНЯЕТЕ построенный запрос, добавляя all()/one(). После выполнения $query->all() возвращается массив объектов ActiveRecord, после $query->one() - один объект ActiveRecord.

Какую данную модель? В конце у вас возвращается МАССИВ моделей, вы же выполняете all().

ActiveDataProvider - по сути это $query, к которому при выборке в гриде добавится all(), вы правы. Для массива есть ArrayDataProvider.
Спасибо за объяснение, теперь понял что к чему!
Евгений Емельянов
Сообщения: 167
Зарегистрирован: 2015.06.10, 10:43

Re: изменение поля при выборке

Сообщение Евгений Емельянов »

Пока по делам ходил, уже ответили
Евгений Емельянов
Сообщения: 167
Зарегистрирован: 2015.06.10, 10:43

Re: изменение поля при выборке

Сообщение Евгений Емельянов »

Если для Грида, то можно предложить такой вариант:
1. делаете выборку как обычно в ActiveDataProvider и передаете в GridView;
2. свойство pwl в модели добавьте в атрибуты:

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

public function attributes()
    {
        return array_merge(parent::attributes(), ['pwl']);
    } 
и в rules:

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

[['pwl'], ..., 'safe'], 
3. в Гриде указываете атрибут pwl:

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

...
[
        'attribute'    => 'pwl',
        'value'        => function ($model, $index) {
            return $model->pwl/$index*10; // здесь любую логику как в foreach - $index здесь как номер строки грида
        },
    ], 
Ну а без DataProvider (с массивом моделей) Вы уже знаете как выводить...
kutuev93
Сообщения: 75
Зарегистрирован: 2016.01.24, 18:15
Откуда: Тюмень

Re: изменение поля при выборке

Сообщение kutuev93 »

Евгений Емельянов писал(а):Если для Грида, то можно предложить такой вариант:
1. делаете выборку как обычно в ActiveDataProvider и передаете в GridView;
2. свойство pwl в модели добавьте в атрибуты:

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

public function attributes()
    {
        return array_merge(parent::attributes(), ['pwl']);
    }
и в rules:

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

[['pwl'], ..., 'safe'],
3. в Гриде указываете атрибут pwl:

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

...
[
        'attribute'    => 'pwl',
        'value'        => function ($model, $index) {
            return $model->pwl/$index*10; // здесь любую логику как в foreach - $index здесь как номер строки грида
        },
    ],
Ну а без DataProvider (с массивом моделей) Вы уже знаете как выводить...
Евгений, у меня сейчас такой подход. Но причина отказаться от $index вызван тем, что здесь мы дописали какую то логику (сделали расчет для числа). Позже мне нужно будет полученный результат занести в другую таблицу. По сути будет логика делаться в 2 местах одна и та же. Нужно по моей логике лучше выполнить это в модели и 1 раз, чтобы вызывая метод, который все уже рассчитал либо запихивать в грид либо в базу как мне нужно.

И еще есть последний вопрос. Я получаю модель, я могу как то для модели (полученных данных) сделать выборку? Мне нужно начала заложить нужный pwl значение, а потом достать нужную строку по какому нибудь столбцу. доставать сразу же не могу, так как pwl не рассчитано

Спасибо
Евгений Емельянов
Сообщения: 167
Зарегистрирован: 2015.06.10, 10:43

Re: изменение поля при выборке

Сообщение Евгений Емельянов »

И еще есть последний вопрос. Я получаю модель, я могу как то для модели (полученных данных) сделать выборку? Мне нужно начала заложить нужный pwl значение, а потом достать нужную строку по какому нибудь столбцу. доставать сразу же не могу, так как pwl не рассчитано
Честно говоря, не очень понятен вопрос, но как мне показалось Вам лучше надо посмотреть в сторону sql-представлений. Получаете модели, делаете расчеты и отправляете новые данные в представление со всеми новыми полями типа pwl или других. Но может, у Вас совсем другое требуется, я из вопроса не понял...
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: изменение поля при выборке

Сообщение caHek2x »

kutuev93 писал(а): foreach ($query as $row)
{
$row->pwl= 50;
}

return $query;

начинаю с этого, но 50 не выводит ни в какую.
я возможно здесь делаю грубую ошибку, потому как состояние массива $query не меняется по сути, а может и должно меняться
я чтото вас не понял .. .вам надо чтоб в вашем query в каждой записи у pwl было 50 ?
эм .. ну так

foreach ($query as &$row)
{
$row->pwl= 50;
}
unset($row)
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: изменение поля при выборке

Сообщение Nerf »

caHek2x писал(а): эм .. ну так

foreach ($query as &$row)
{
$row->pwl= 50;
}
unset($row)
Объект по ссылке?! :shock:
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: изменение поля при выборке

Сообщение caHek2x »

Объект по ссылке?! :shock:
да не прав ... нет смысла в этом ... :( :?
kutuev93
Сообщения: 75
Зарегистрирован: 2016.01.24, 18:15
Откуда: Тюмень

Re: изменение поля при выборке

Сообщение kutuev93 »

Напишу в свое тему пожалуй, вопрос такой:

У меня существует лимит: ->limit($num);

после этого добавляется еще один ->andFilterWhere('like', 'id', 3)

Данный объект существует в выборке до лимита, лимит его отрезает, но после уточнения он снова на месте. Я в чем то неправ, либо лимит в этом случае не задействуется?

то есть по сути я хотел бы получить 0, так как этого id нет в данном лимите
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: изменение поля при выборке

Сообщение caHek2x »

то есть вы хотите сделать выборку на 100 элементов .. .а потом у них отфильтровать уже условием .. ?
помоему нет разницы в каком порядке вы напишете параметры(limit, where ...) в построителе запросов ... он в итоге построит один(или сколько нужно для ваших with ...) цельный запрос ...
посмотрите в логах какой он запрос формирует ... мне кажется там будет чтото типа "SELECT .... WHERE id LIKE 3 LIMIT 100"
kutuev93
Сообщения: 75
Зарегистрирован: 2016.01.24, 18:15
Откуда: Тюмень

Re: изменение поля при выборке

Сообщение kutuev93 »

caHek2x писал(а):то есть вы хотите сделать выборку на 100 элементов .. .а потом у них отфильтровать уже условием .. ?
помоему нет разницы в каком порядке вы напишете параметры в построителе запросов ... он в итоге построит один единый цельный запрос ...
посмотрите в логах какой он запрос формирует ... мне кажется там будет чтото типа "SELECT .... WHERE id LIKE 3 LIMIT 100"
ну, я так не думаю.
у меня есть 200 строк которые как то там отсортированы до этого, я говорю, что мне нужно взять 100 строк. а потом из этой выборки узнать есть ли в этой выборке строка с id который я указываю. то есть результат (->one()) должен вернуть либо ноль либо строку.

я в чем то неправ?
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: изменение поля при выборке

Сообщение caHek2x »

kutuev93 писал(а):
caHek2x писал(а):то есть вы хотите сделать выборку на 100 элементов .. .а потом у них отфильтровать уже условием .. ?
помоему нет разницы в каком порядке вы напишете параметры в построителе запросов ... он в итоге построит один единый цельный запрос ...
посмотрите в логах какой он запрос формирует ... мне кажется там будет чтото типа "SELECT .... WHERE id LIKE 3 LIMIT 100"
ну, я так не думаю.
у меня есть 200 строк которые как то там отсортированы до этого, я говорю, что мне нужно взять 100 строк. а потом из этой выборки узнать есть ли в этой выборке строка с id который я указываю. то есть результат (->one()) должен вернуть либо ноль либо строку.

я в чем то неправ?
сделайте такую выборку и посмотрите на запрос в логах ... результат one как я понимаю делает просто limit 1 или просто возвращает из найденного первую запись ..
на сколько я понимаю искаться будет по всей таблице ваше условие ... а потом к найденному применяться лимит ... проверьте на практике и все станет понятнее когда увидите запрос ...
kutuev93
Сообщения: 75
Зарегистрирован: 2016.01.24, 18:15
Откуда: Тюмень

Re: изменение поля при выборке

Сообщение kutuev93 »

caHek2x писал(а):
kutuev93 писал(а):
caHek2x писал(а):то есть вы хотите сделать выборку на 100 элементов .. .а потом у них отфильтровать уже условием .. ?
помоему нет разницы в каком порядке вы напишете параметры в построителе запросов ... он в итоге построит один единый цельный запрос ...
посмотрите в логах какой он запрос формирует ... мне кажется там будет чтото типа "SELECT .... WHERE id LIKE 3 LIMIT 100"
ну, я так не думаю.
у меня есть 200 строк которые как то там отсортированы до этого, я говорю, что мне нужно взять 100 строк. а потом из этой выборки узнать есть ли в этой выборке строка с id который я указываю. то есть результат (->one()) должен вернуть либо ноль либо строку.

я в чем то неправ?
сделайте такую выборку и посмотрите на запрос в логах ... результат one как я понимаю делает просто limit 1 или просто возвращает из найденного первую запись ..
на сколько я понимаю искаться будет по всей таблице ваше условие ... а потом к найденному применяться лимит ... проверьте на практике и все станет понятнее когда увидите запрос ...
скорее всего так и есть, вопрос в том как правильно?
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: изменение поля при выборке

Сообщение caHek2x »

да сейчас протестировал на всякий случай ...
как я и говорил порядок указания where и limit не имеет значения ... при выполнении one или all он сам поставит их в нужном порядке ... на то это и конструктор запросов ...
one не делает limit 1 как я предположил ... он просто из выборки сам берет первую запись ...
вопрос в том как правильно?
что как правильно ? выбрать а потом проверить есть ли в этой выборке то что ищете ? .. ну вот и ответ .. .выбрать без условия а потом проверить ... циклом пробегите например ... но в чем смысл ? может вы бы поточнее описали задачу ... и на самом деле все окажется намного проще ...
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: изменение поля при выборке

Сообщение caHek2x »

если хотите все решить без php а чисто mysql то сделайте более сложную выборку ...

SELECT * FROM (
SELECT * FROM test LIMIT 100
) t
WHERE id = 3

и тогда это уже будет условие относиться не ко всей таблице .. а именно к этим выбранным 100 записям ...
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: изменение поля при выборке

Сообщение zelenin »

SELECT * FROM test LIMIT 100 having id = 3
kutuev93
Сообщения: 75
Зарегистрирован: 2016.01.24, 18:15
Откуда: Тюмень

Re: изменение поля при выборке

Сообщение kutuev93 »

на active record я так понимаю я перевести не смогу данный запрос?
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: изменение поля при выборке

Сообщение caHek2x »

zelenin писал(а):SELECT * FROM test LIMIT 100 having id = 3
having после лимита можно ставить ? разве ? перепроверите ... он после group да ... но не лимита ...
Последний раз редактировалось caHek2x 2016.05.27, 19:02, всего редактировалось 1 раз.
Ответить