Подскажите задания для новичков

Фанат

oncle terrible
Команда форума
Фанат
Какая чушь... то что ты думаешь что работа с БД это только пихнул строку в какую-то обертку и пусть заработает это зря.
совершенно верно.
Открою тебе стрррашную тайну: в глубине любой обёртки лежит SQL.
Даже если прикладной код делает $user->save(), где-то во глубине сибирских руд фреймворка всё равно должна быть составлена строка запроса, и этот запрос отправлен на выполнение.
Наверняка авторы популярных фреймворков такие прям нубы, что сделали так, а не как великий Фанат.
Увы, это так.
 

Фанат

oncle terrible
Команда форума
Фанат
Решение с mysql функциями делается введением объекта Expression и одного ифа
Жаль, я не привёл этот пример сразу:
PHP:
$sql = "INSERT INTO table SET ts=unix_timestamp(),ip=inet_aton(?s),?u)";
$db->run($sql,$ip,$data);
покажи код на твоих плугинах.

PHP:
public function insert($table, array $data) {
        if (isset($this->_plugins['timing'])) {
Ты сам не понимаешь, что этим ифом ты открываешь ворота ада?
что у тебя этих ифов в итоге наберется 100500, и понять, как работает твой Simple, my ass, PHP Framework будет в принципе невозможно?

delete у тебя не работает с джойнами.
В итоге ты получил функцию для экономии ровно двух слов - FROM и WHERE. Просто офигеть, какая польза! При этом она все равно не подходит для любого мало-мальски сложного случая но при этом вызывается своим собственным синтаксисом, который не является ни SQL, ни РНР.

Логику работы объекта $where и функции getData() я, кстати, не понял. Что тоже прибавляет простоты твоему фреймворку.
 

Ragazzo

TDD interested
Фанат
Открою тебе стрррашную тайну: в глубине любой обёртки лежит SQL.
а я то думал там магия...как я жестоко ошибался, оказывается запросы это просто текст...nooo... шутки в сторону, интересно посмотреть как ты будешь например делать простой ORM без каких-либо примитивных insert и delete, каждый раз писать кучи повторного кода?хах.
ладно, я сваливаю, т.к. ты всегда думаешь что твое мнение истинно верное, что и выливается то в поиск шаблона какого-то на кучу страниц то вот в это.
P.S. никого оскорбить не пытался, но то что ты не видишь таких очевидных вещей как-то удивляет даже очень.
 

Redjik

Джедай-мастер
AmdY
Больше Док Блоков - не ленись =)
Код понравился.
 

Фанат

oncle terrible
Команда форума
Фанат
интересно посмотреть как ты будешь например делать простой ORM.
"ОРМ - это штука, которая позволяет простые вещи делать сложно, а сложные - никак" ;)

Когда ты задумываешь "простой ОРМ", то тебе действительно кажется, что ты сделаешь в базовом классе метод delete и в простых объектах тупо дергать его, не определяя специально. Но в реальности простых объектов не получается, и на каждый метод пишется здоровенный оверрайд: там надо из двух таблиц подчистить, здесь - картинки ещё подтереть, ещё где-то кэш передёрнуть - и так далее.

Об этом я и говорю всё время - о фантазиях, которые почему-то не разрушаются, даже тогда, когда не выдерживают столкновения с реальностью. Прогер начинает городить 100500 воркараундов, но от своей красивой теории не отказывается.
 

fixxxer

К.О.
Партнер клуба
А вот щас я расскажу, как делаю я, безо всяких ORM. Необычный подход, сразу предупреждаю ;)

PHP:
class TableModel {
self::$sql_table_insert = "INSERT INTO
   {{ t('table') }}
SET
  ts = {{ now() }},
  ip = INET_ATON({{ i(ip) }})";
...
$this->db()->query(self::$sql_table_insert, $this->toArray());
...
}
SqlBuilder extends Blitz. :)
 

AmdY

Пью пиво
Команда форума
PHP:
$sql = "INSERT INTO table SET ts=unix_timestamp(),ip=inet_aton(?s),?u)";
$db->run($sql,$ip,$data);
//
$data = ['ts' => $db->getExpr('unix_timestamp()')];
if ($ip) { // вот собственно зачем нужны эти массивы и магический класс Db\Where, они позволяют реализовать билдер.
    $data['ip'] = $db->getExpr('inet_aton(?)', ['127.0.0.1']);
}
$db->insert('test', $data);
покажи код на твоих плугинах. Ты сам не понимаешь, что этим ифом ты открываешь ворота ада?
PHP:
if (isset($this->_plugins['timing'])) {
    $data['created_at'] = empty($data['created_at']) ? time() : $data['created_at']; // опять же плюсы массива, а не строки запроса
    $data['updated_at'] = empty($data['updated_at']) ? time() : $data['updated_at'];
}
Этот класс вырезка из основного фреймворка, сейчас избавляюсь от ифов и pre*, affter* в пользу магии замыканий. Я понимаю что это ворота в ад, но без них было ещё хуже, так как постоянно приходилось городить магию, а сейчас она концентрируется в одном месте. Приходится искать границы между простотой и идеальностью.
delete у тебя не работает с джойнами.
Для таких случаев есть возможность писать прямые запросы в формате sql. Я ничем не ограничиваю функциональность.

В итоге ты получил функцию для экономии ровно двух слов - FROM и WHERE. Просто офигеть, какая польза!
Нет, я получил простой бидлер, получил поддержку плагинов, получил единые точки входа для операций с базой. При желании insert можно перепоределить и писать на мастер слейв, а fetch бытаться брать из мемкеша и лишь затем делать реальный запрос и т.д. и т.п.
 

AmdY

Пью пиво
Команда форума
fixxxer
угу, я помню, ты код этот приводил как-то, прикольный подход, который опять же поддерживает билдинг, так как можно в шаблоне использовать логические операторы.
 

Ragazzo

TDD interested
Фанат
"ОРМ - это штука, которая позволяет простые вещи делать сложно, а сложные - никак"
просто открой уже для себя фреймворки, где нормально делаются и связи и другие сложные релейшены к AR моделям, те проблемы которые ты описываешь, возникают, когда какой-то программист думает что он самый умный и начинает писать свой новыймегасуперFW/CMS, что витоге выливается в какое-то гавно по сути.
 

fixxxer

К.О.
Партнер клуба
Ragazzo
Не вижу я, к сожеланию, ни одного php-фреймворка, где это сделано нормально. Да, была нормальная doctrine 1, во второй версии превратилась в памятник оверинжинирингу (да и симфони2 тоже по той же дороге идет семимильным шагами). В yii релейшены неполноценны - они только на селект. В yii2 вон обещают, ну посмотрим.

Вот нового ZF я не видел, стоит глянуть? Впрочем, я решаю довольно нетипичные задачи, и не видел ни одного фреймворка, который я смогу расширить без патчей на его core для моих нужд... то есть скажем symfony 2 могу, но в жопу, мне не нужны лишние сто метров джавы головного мозга
 
  • Like
Реакции: Gas

Фанат

oncle terrible
Команда форума
Не стоило зря усложнять код. Условный билдинг - это другое. То есть, получается такой код:
PHP:
$data['ts'] => $db->getExpr('unix_timestamp()')];
$data['ip'] => $db->getExpr('inet_aton(?)', ['127.0.0.1']);
$db->insert('test', $data);
получается, что плугины не при чём.
Ухудшается только читабельность.
Получается, тебе пришлось поверх ПДО-шного громоздить отдельный парсер плейсхолдеров. И всё это - ради экономии двух слов ;-)
 

fixxxer

К.О.
Партнер клуба
Кстати да. "Вы либо крестик снимите, либо трусы наденьте." :)
 

Фанат

oncle terrible
Команда форума
fetch пытаться брать из мемкеша и лишь затем делать реальный запрос и т.д. и т.п.
Не можешь.
Ты подвязан на свои SQLевские getExpr. Ты толкьо сделал вид, что убрал SQL из кода, но на самом деле ты его оставил.
поэтому тебе для работы с мемкешом придется либо прикручивать парсер SQL, либо распрощаться с красивой мечтой.

Мой код делает только одно - он не врёт себе. Если SQL - то мы выполняем SQL, не пряча его в красивые одёжки.
 

AmdY

Пью пиво
Команда форума
Я написал какие плюсы получил, минус здесь только один - время затраченое на написание наколеночной обвески, которая в любом случае отбивается уже в первом же проекте за счёт полученых плюшек по расширяемости. В остальном остаются все возможности PDO, без ограничений.
 

Ragazzo

TDD interested
fixxxer
на селект да, на апдейт и прочее из CRUD можно обойтись: тразакция + действия с нужными моделями в поведении, которое вешается на нужную главную модель, все банально просто.
 

AmdY

Пью пиво
Команда форума
У тебя в delete() остался тот же самый обрезанный SQL без двух слов, запихнутый в getExpr.
Ты просто цепляешься к решению то с одной стороны, то с другой, забывая что я уже показал какая польза была от тех решений.
Ну давай по delete
PHP:
public function delete($table, $where = '')
{
    if (isset($this->_plugins['softdelete'])) {
        return $this->update($table, ['deleted' => 1])
    }
    // код обычного удаления
}
 

Фанат

oncle terrible
Команда форума
Ты просто цепляешься
Я не цепляюсь. Я просто показываю бессмысленность этой функции, притворяющейся абстракцией.

Вызывается она таким кодом:
PHP:
$db->delete($table, $db->getExpr('id =?', [$id]))
В котором мы видим тот же самый SQL запрос.

никакого абстрагирования от SQL у тебя не получилось, но вместо читабельного SQL(такого, например)
PHP:
$db->run("DELETE FROM ?n WHERE id =?i', $table, $id))
у тебя просто получилось нагромождение конструкций РНР и огрызков SQL.

Я думаю, твоя проблема в том, что ты пытаешься скрестить ежа с ужом - из драйвера SQL сделать некое абстрактное хранилище.
Но, во-первых, оно получается совершенно непортабельныи и неюзабельным (никем, кроме тебя лично, знающего всю подноготную магию), а, во-вторых. всё равно не становится универсальным.
 

AmdY

Пью пиво
Команда форума
Фанат
Блин, ну где я писал что я пытаюсь избавиться от SQL, это просто немножко сахара и возможнотей для расширения, привёл пример реализации софт делейта, который ты опять же проигнорировал, чтоно так же как и примеры в тестах, где юзается getWhere, потому что при реализации того же софт делейта, этот where будет предефайнен для fetchOne, fetchAll, поэтому getExpr использовать здесь не стоит, так как это не билдер, а лишь обёртка, чтобы можно было использовать конструкции SQL в качестве значений.
А ты тыкаешь нерасширябельным
PHP:
$db->run("DELETE FROM ?n WHERE id =?i', $table, $id))
Да, твой пример решает задачу, но на таком учиться, это как писать линейный спагетти код, тоже работает, тоже удобно и быстро, но это тупик. Когда учишь, нужно в первую очередь показывать, как не попадать в такие тупики и тогда человек понимает зачем все эти абстракции.
 
Сверху