These are chat archives for PHPixie/Hotline

6th
Nov 2015
Vadim Meling
@Linfuby
Nov 06 2015 05:52

@dracony Добрый день. Обратил внимание, что Slice очень долго работает.
Такая конструкция проходит 1 000 записей за 1 минуту

foreach($slice->keys() as $key){
    $data = $slice->get($key);
    //Обработка записи
}

В то время как такая конструкция обратывает 50 000 записей за 1 минуту

foreach($slice->getData() as $data){
    //Обработка записи
}
Roman Tsiupa
@dracony
Nov 06 2015 08:53
это потому что каждый get()
проходит весь путь до эднмннта с самого верху
для того чтобы не упустить изменения
например
$sliceA = $data->slice('a');
$slicrAB = $data->slice('a.b');
$sliceAB->set('c', 5);
$sliceA->get('b.c') === 5;
в фориче лучше getData()
я еще добавлю immutableSlice()
который не будет с корня читать
Vadim Meling
@Linfuby
Nov 06 2015 08:59
:(
А так было удобно пользоваться Slice. Придется обычными массивами в циклах...
С кучей isset()
Roman Tsiupa
@dracony
Nov 06 2015 09:27
так пользуйся дальше))
я сделаю immutable сегодня тогда)
там писать мало надо
только красивые имена придумать методам)
Roman Tsiupa
@dracony
Nov 06 2015 14:38
уже почти закончил)
сегодня будет)
Ivan
@Punk-UnDeaD
Nov 06 2015 17:31
послушал сегодня подкаст, заинтересовался
но есть у меня один вопрос, который последние 3 года регулярно встаёт
как у пикси с обновлением модели при непрерывной интеграции?
всё ли легко автоматически создаётся/обновляется?
vsg68
@vsg68
Nov 06 2015 18:37
@dracony привет! стикер пришел - спасибо :)
Kostya
@KokaUA
Nov 06 2015 18:37
@Punk-UnDeaD Ну по сути в пикси нету моделей.
Ну в смысле в орм
Ivan
@Punk-UnDeaD
Nov 06 2015 18:41
а в каком-то другом смысле?
если у меня пользователь и у него набор полей, я хочу определить новое поле, что надо делать, чтоб оно в базу добавилось?
я с Друпалом работал, у нас есть куча костылей для этого
а красивых решений пока нет
Kostya
@KokaUA
Nov 06 2015 19:06
Или модуль миграции со второй пикси, или какой либо другой. Ну или хардкор, ручное редактирование структуры бд
Ну или если ты имел ввиду обновления текущих данных, то после изменений вызывать на сущьности save()
Ivan
@Punk-UnDeaD
Nov 06 2015 19:12
данные - это более другой вопрос, с ними понятно, что ничего не понятно
мне бы такое чтоб посмотрел в конфиги, сравнил с текущим состоянием и исправил разницу
Kostya
@KokaUA
Nov 06 2015 19:13
Ну как-бы конфиги к состоянию бд не относятся
Ivan
@Punk-UnDeaD
Nov 06 2015 19:14
ну это понятно, но кто-то же должен приводить базу данных к виду, который требуется для вновь разработанного кода
Kostya
@KokaUA
Nov 06 2015 19:14
Ну или миграция или руками.
Roman Tsiupa
@dracony
Nov 06 2015 20:07
tut)
@vsg68 a fotka =) ?
@Punk-UnDeaD в пикси не надо менять конфиг при изменениях в бд
если ты просто добавил полей в базу или новую таблицу
все будет работать без изменения конфига
если проблема в том как собственно внести изменения в базу то советую https://phinx.org/
это тулза для мигрирования БД, когда надо внести изменения куда-то ты просто создаешь новый конфиг файл и запускаешь ее
Ivan
@Punk-UnDeaD
Nov 06 2015 20:52
@dracony я наверное недостаточно ясно выразился
дело не в миграции, а в том, что за время разработки база данных претерпевает изменения
сегодня мы разработали одну вещь, двинули её на прод, а на следующий день новая вещь требует новых таблиц в базе данных или добавление новых полей и индексов
Roman Tsiupa
@dracony
Nov 06 2015 20:59
ну так это и есть миграция, нет?
вот эти изменения и делаешь пфинксом
Roman Tsiupa
@dracony
Nov 06 2015 21:06
<?php

use Phinx\Migration\AbstractMigration;

class CreateUserLoginsTable extends AbstractMigration
{
    /**
     * Change Method.
     *
     * More information on this method is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-change-method
     *
     * Uncomment this method if you would like to use it.
     */
    public function change()
    {
        // create the table
        $table = $this->table('user_logins');
        $table->addColumn('user_id', 'integer')
              ->addColumn('created', 'datetime')
              ->create();
    }

    /**
     * Migrate Up.
     */
    public function up()
    {

    }

    /**
     * Migrate Down.
     */
    public function down()
    {

    }
}
Ivan
@Punk-UnDeaD
Nov 06 2015 21:28
ну на каждый день миграцию не попишешь
изменения то потоком идут
хотелось бы определить схему и в схему вносить изменения
Roman Tsiupa
@dracony
Nov 06 2015 21:40
ну так никто не мешает сделать несколько миграций за один день
создал табличку вот и миграция
для схем тоже тулзы есть
но я бы не советовал честно говоря
потому что система должна угадать что имзменилось
и если у нее не получиться
то можно реально угробить базу)
и вот например
есть у тебя поле 'views'
ты решыл изменить его на 'viewCount'
миграцией легко
а вот если просто в схеме поменяеш имя
то скорее всего система просто удалит старую колонку
и создаст новую
и все данные пропадут
Ivan
@Punk-UnDeaD
Nov 06 2015 21:44
переименования действительно не работают, тут я на все сто согласен
Roman Tsiupa
@dracony
Nov 06 2015 21:44
в конце концов когда сайт уже будет запущен
все равно когда0то придеться внести какое-то изменение
часто с данными
и все равно придеться использовать миграции)
Ivan
@Punk-UnDeaD
Nov 06 2015 21:45
я мыслю категорией, что сайт запущен всегда
и практически нет изменений, которые приходят на нулевую инсталяцию
Roman Tsiupa
@dracony
Nov 06 2015 21:48
если все таки хочеться схему попробуй Пропел
он поддержывает миграции по схеме
Ivan
@Punk-UnDeaD
Nov 06 2015 21:48
добавление полей или таблиц, равно как удаление их, плюс индексы - это решается
без миграции данных, миграция - это отдельная боль
Roman Tsiupa
@dracony
Nov 06 2015 21:48
я его когда-то использовал и вроде ничего
кстати еще один плюс использования миграций для добавления таблиц и тд
триггеры, хитрые дефолтные значения итд
в схема такое не пропишеш
Roman Tsiupa
@dracony
Nov 06 2015 22:09
@Linfuby дописал слайс
кароч если сделать $sliceB = $sliceA->arraySlice('b');
то оно сделает "быстрый слайс" )
с копией субмассива ( вместо того чтобы каждый раз считивать с самого верха)
$sliceC = $sliceB->slice('c'); Тоже будет быстрым
так что хватает сделать раз
если использовать ->arrayData() а не ->editableArrayData() то все слайсы тоже быстрые
но они конечно же только для чтения
тоесть ->set() ->remove() нет
Ivan
@Punk-UnDeaD
Nov 06 2015 23:29
Хм, я наверное недостаточно ясно