Laravel ORM vs. raw SQL на практическом примере

флоппик

promotor fidei
Команда форума
Партнер клуба
Я честно говоря, тупо слабо понимаю их структуру. (
 

Фанат

oncle terrible
Команда форума

Фанат

oncle terrible
Команда форума
Да, кстати. Еще хотел написать, что глядя на код
PHP:
        return View::make('word', [
            'word' => Word::where('lemma', '=', 'good')
                ->with([
                        'sense',
                        'sense.synset',
                        'sense.synset.sample',
                        'sense.synonyms.word'
                        ])
                ->get(),
            'query' => DB::getQueryLog(),
        ]);
с щемящей грустью понимаешь, что теплый ламповый похапе превратился в холодную и скользкую жабу %)
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Меня поначалу тоже изрядно плющило, а сейчас, когда больше приходится проектировать, чем писать занудные детальные реализации, я прям удовольствие получаю когда можно глядеть на код и читать в нем мысль по диагонали. Со времен бейсика так круто не было :D
 

AmdY

Пью пиво
Команда форума
ксли бы на java такое было, то у php шансов б не было, на джаве будет ближе к досктрине и тоны кода.
 

Фанат

oncle terrible
Команда форума
Антонимы сделал тоже, получилось в сумме 8 запросов, суммарным временем исполнения ~10 миллисекунд
Я начинаю уважать Ларавель. То есть, он сделал то, что я планировал сделать сам - собрать все нужные айдишники, засунуть в ИН, и сделать один запрос вместо кучи запросов в цикле - а потом раскидать полученные данные по соответствующим записям.

Два вопроса.
Почему у меня имя класса в hasMany подцепилось только в том же регистре - Sense, Word?
Можно сделать так, чтобы слово, возвращаемое в коллекции синонимов, само не было коллекцией (чтобы не обращаться к нему, как $syn->word[0]->lemma)?
 
Последнее редактирование:

флоппик

promotor fidei
Команда форума
Партнер клуба
Почему у меня имя класса в hasMany подцепилось только в том же регистре - Sense, Word?
Потому что я ленивая жопа, и писал второпях и под виндой )))) Вообще там должно быть имя класса модели по нормальному PSR.
Можно сделать так, чтобы слово, возвращаемое в коллекции синонимов, само не было коллекцией (чтобы не обращаться к нему, как $syn->word[0]->lemma)?
Оно не будет коллекцией, если связь один-к-одному, но я там переиспользую существующую связь sense->word, которая один-к-многим (что возможно, неверно, я не уверен). Если оно все же один-к-одному, то hasOne и индекс массива не нужен там.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Я начинаю уважать Ларавель.
Я считаю, что нормальная разработка должна идти сверху вниз: Накидал каркас, завел, доработал, нашел проблемные места, если спустя месяц вдруг окажется, что у меня тормозят синонимы, я выкину из метода synonyms() hasMany() сделаю там выборку чистым SQL, и верну заполненную модель, а не буду месяц обсуждать, что мне нужно выделить в persistense layer или в другой модный на этот момент слой domain model. А скорее всего, в 99% случаев, я в это место никогда не вернусь, просто потому что оно тормозить не будет. Возможно это уже сделаю даже не я, но логика заложенная не пострадает. Этот подход мне кажется тем самым CI по факту, которое тут в соседней теме не могут понять.
 

Вурдалак

Продвинутый новичок
Пост флоппика — ну прямо пример хорошей рекламы. Всем понравилось, даже если они ничего не поняли.
а не буду месяц обсуждать, что мне нужно выделить в persistense layer или в другой модный на этот момент слой domain model
Во, ваще, чистый маркетинг, умные слова, показывающие всю «сложность» и «абсурдность» иных, отличных от Laravel-style подходов, подкреплённая фразой «месяц обсуждать». Кто-нибудь из лайкнувших понял о чём тут речь? Я не понял что тут можно «месяц обсуждать» и какое отношение domain model имеет к инфраструктурному слою (raw SQL vs ORM vs ...).
выкину из метода synonyms() hasMany() сделаю там выборку чистым SQL <...> Возможно это уже сделаю даже не я, но логика заложенная не пострадает.
Вообще-то это нам позволяет делать инкапсуляция, а не божественный Laravel. Ты это преподносишь так, словно это нечто эксклюзивное. Этого можно достичь просто написав
PHP:
return View::make('word', [
            'word' => $this->wordRepository->findByLemma('good'),
            'query' => DB::getQueryLog(),
        ]);
— достаём ли мы с помощью ORM, raw SQL или вообще из какого-то NoSQL-хранилища, мы не знаем. Я тут никакой заслуги Laravel не вижу вообще.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Я тут никакой заслуги Laravel не вижу вообще.
Не вижу в моем посте ни единой буквы, где я говорю, что это заслуга исключительно Laravel. А "что вынести в persistense layer" обсуждают в этом треде до моего сообщения.
 

fixxxer

К.О.
Партнер клуба
Ай, так если решение "в лоб" с eager loading подходит, о чем вообще речь:)

Я как-то сразу отмел, решив что уже проверено и не подошло, исходя из постановки вопроса :bang:
 

Вурдалак

Продвинутый новичок
флоппик, ты процитировал Фанат'а «Я начинаю уважать Ларавель». Фанат, будучи человеком впечатлительным, наверняка утвердился во мнении, что всё это — заслуга Laravel. Мол, это тебе не в тапки срать, тут можно взять и на raw SQL поменять, если будет тормозить. Всё сюрьёзно.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
флоппик, "точка зрения зависит от места сидения" (С)
этот подход далеко не универсален
 

флоппик

promotor fidei
Команда форума
Партнер клуба
grigori, ни один подход не универсален. Можно вообще код никогда не писать, он тоже никогда не будет идеален.
 
Сверху