<!DOCTYPE html>
<html class="h-100" data-bs-theme="light" data-mantine-color-scheme="light" lang="ru" prefix="og: https://ogp.me/ns#">
<head>
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<meta content="IE=Edge" http-equiv="X-UA-Compatible">
<link crossorigin="true" href="https://cdn.hexlet.io" rel="preconnect">
<link href="https://mc.yandex.ru" rel="preconnect">
<meta content="aa2vrdtq64dub8knuf83lwywit311w" name="facebook-domain-verification">
<link href="/favicon.ico" rel="icon" sizes="any">
<link href="/favicon.svg" rel="icon" type="image/svg+xml">
<link href="/apple-touch-icon.png" rel="apple-touch-icon">
<link href="/manifest.webmanifest" rel="manifest">
<script>
//<![CDATA[
window.gon={};gon.ym_counter="25559621";gon.is_bot=true;gon.applications={};gon.current_user={"id":null,"last_viewed_notification_id":null,"email":null,"state":null,"first_name":"","last_name":"","created_at":"2026-02-26 20:10:08 UTC","current_program":null,"current_team":null,"full_name":"","guest":true,"can_use_paid_features":false,"is_hexlet_employee":false,"sanitized_phone_number":"","can_subscribe":true,"can_renew_education":false};gon.token="DsHoVdflPrrq9u_22FAoxNLC3hiytJ5f3btmSqvYGuvhECNiJZuT2ly1y27UX9izEsvzsrqDYP1gW_we-d_9hQ";gon.locale="ru";gon.language="ru";gon.theme="light";gon.rails_env="production";gon.mobile=false;gon.google={"analytics_key":"UA-1360700-51","optimize_key":"GTM-5QDVFPF"};gon.captcha={"google_v3_site_key":"6LenGbgZAAAAAM7HbrDbn5JlizCSzPcS767c9vaY","yandex_site_key":"ysc1_Vyob5ZPPUdPBsu0ykt8bVFdzsfpoVjQChLGl2b4g19647a89","verification_failed":null};gon.social_signin=false;gon.typoreporter_google_form_id="1FAIpQLSeibfGq-KvWQ2Fyru-zkFFRVTLBuzXAHAoEyN1p49FtDmNoNA";
//]]>
</script>
<meta charset="utf-8">
<title>Настройка ORM | PHP: Eloquent (ORM)</title>
<meta name="description" content="Настройка ORM / PHP: Eloquent (ORM): Заводим подготовленный пакет с ORM у себя на локальном компьютере">
<link rel="canonical" href="https://ru.hexlet.io/courses/php-orm-eloquent/lessons/setup/theory_unit">
<meta name="robots" content="noarchive">
<meta property="og:title" content="Настройка ORM">
<meta property="og:title" content="PHP: Eloquent (ORM)">
<meta property="og:description" content="Настройка ORM / PHP: Eloquent (ORM): Заводим подготовленный пакет с ORM у себя на локальном компьютере">
<meta property="og:url" content="https://ru.hexlet.io/courses/php-orm-eloquent/lessons/setup/theory_unit">
<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="S68UvCsG4rUDLCgj-hOf0yGYWELi-8NYcEXq-WCDdDSkft-L2XhP1bVvDLv2HG-k4ZF16OrMPfrNpXCtMoSTWg" />
<script src="/vite/assets/inertia-DfXos102.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/preload-helper-BJ4cLWpC.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/init-BrRXra1y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ahoy-DrlRQ-1D.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/analytics-cb8xch9l.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ErrorFallbackBlock-naDSYSy9.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Surface-DL2bpZA-.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/gon-D3e4yh1x.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/mantine-CGMYrt2Y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/utils-DRqSHbQE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/extends-C-EagtpE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/inheritsLoose-BBd-DCVI.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/objectWithoutPropertiesLoose-DRHXDhjp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/index.esm-DAqKOkZ0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Button-CGPUux8l.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/CloseButton-D1euiPao.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Group-BX48WcuU.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Loader-BQEY8g6v.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Modal-Cy3HByv7.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/OptionalPortal-1Hza5P2w.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Stack-CtjJzfw4.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Textarea-Ck64llAy.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Box-B5-OOzBf.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/DirectionProvider-Dc9zdUke.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/events-DJQOhap0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-reduced-motion-D2owz4wa.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-disclosure-zKtK5W1r.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-hotkeys-Cnc_Rwkb.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/random-id-DOQyszCZ.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/notifications.store-C-3AFSMn.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/exports-C_MrNx_T.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/axios-BEvgo0ym.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dayjs.min-BkKovM-s.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/i18next-BlSq9s7B.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/client-U9M77rxp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-dom-DaLxUz_h.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useTranslation-Bx1Cdrkz.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/compiler-runtime-6XxiPFnt.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/jsx-runtime-CwjcCKJi.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-CkL4ZRHB.js" as="script" crossorigin="anonymous">
<link rel="stylesheet" href="/vite/assets/application-BqhCP46M.js" />
<script src="/vite/assets/application-Df9RExpe.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/autocomplete-VMNbxKGl.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/createPopper-C3aM9r1M.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/js.cookie-D1-O8zkX.js" as="script" crossorigin="anonymous"><link rel="stylesheet" href="/vite/assets/application-C8HjmMaq.css" media="screen" />
<script>
window.ym = function(){(ym.a=ym.a||[]).push(arguments)};
window.addEventListener('load', function() {
setTimeout(function() {
ym.l = 1*new Date();
ym(window.gon.ym_counter, "init", {
clickmap: true,
trackLinks: true,
accurateTrackBounce: true,
webvisor: true
});
// Загружаем скрипт
var k = document.createElement('script');
k.async = 1;
k.src = 'https://mc.yandex.ru/metrika/tag.js';
document.head.appendChild(k);
ym(window.gon.ym_counter, 'getClientID', function(clientID) {
window.ymClientId = clientID;
});
}, 1500);
});
</script>
<!-- Google Tag Manager - deferred -->
<script>
// dataLayer stub сразу — пуши работают до загрузки скрипта
window.dataLayer = window.dataLayer || [];
// Сам скрипт — отложенно после load
window.addEventListener('load', function() {
setTimeout(function() {
dataLayer.push({'gtm.start': new Date().getTime(), event: 'gtm.js'});
var j = document.createElement('script');
j.async = true;
j.src = 'https://www.googletagmanager.com/gtm.js?id=GTM-WK88TH';
document.head.appendChild(j);
}, 1500);
});
</script>
<!-- End Google Tag Manager -->
</head>
<body>
<noscript>
<div>
<img alt="" src="https://mc.yandex.ru/watch/25559621" style="position:absolute; left:-9999px;">
</div>
</noscript>
<header class="sticky-top bg-body">
<nav class="navbar navbar-expand-lg">
<div class="container-xxl">
<a class="navbar-brand" href="/"><img alt="Логотип Хекслета" height="24" src="https://ru.hexlet.io/vite/assets/logo_ru_light-BpiEA1LT.svg" width="96">
</a><button aria-controls="collapsable" aria-expanded="false" aria-label="Меню" class="navbar-toggler border-0 mb-0 mt-1" data-bs-target="#collapsable" data-bs-toggle="collapse">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="collapsable">
<ul class="navbar-nav mb-lg-0 mt-lg-1">
<li class="nav-item dropdown">
<button aria-haspopup class="btn nav-link" data-bs-toggle="dropdown" type="button">
Все курсы
<span class="bi bi-chevron-down align-middle ms-1"></span>
</button>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item d-flex py-2" href="/courses"><div class="fw-bold me-auto">Все что есть</div>
<div class="text-muted">117</div>
</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li class="dropdown-item">
<b>Популярные категории</b>
</li>
<li>
<a class="dropdown-item py-2" href="/courses_devops">Курсы по DevOps
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_data_analytics">Курсы по аналитике данных
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_programming">Курсы по программированию
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_testing">Курсы по тестированию
</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li class="dropdown-item">
<b>Популярные курсы</b>
</li>
<li>
<a class="dropdown-item py-2" href="/programs/devops-engineer-from-scratch">DevOps-инженер с нуля
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/go">Go-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/java">Java-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/python">Python-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/qa-auto-engineer-java">Автоматизатор тестирования на Java
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/data-analytics">Аналитик данных
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/frontend">Фронтенд-разработчик
</a></li>
</ul>
</li>
<li class="nav-item dropdown">
<button aria-haspopup class="btn nav-link" data-bs-toggle="dropdown" type="button">
О Хекслете
<span class="bi bi-chevron-down align-middle"></span>
</button>
<ul class="dropdown-menu bg-body">
<li>
<a class="dropdown-item py-2" href="/pages/about">О нас
</a></li>
<li>
<a class="dropdown-item py-2" href="/blog">Блог
</a></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/hse-research" role="button">Результаты (Исследование)
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://career.hexlet.io" role="button">Хекслет Карьера
</span></li>
<li>
<a class="dropdown-item py-2" href="/testimonials">Отзывы студентов
</a></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://t.me/hexlet_help_bot" role="button">Поддержка (В ТГ)
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/referal-program/?promo_creative=priglasite-druzei&promo_name=referal-program&promo_position=promo_position&promo_start=010724&promo_type=link" role="button">Реферальная программа
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/certificate" role="button">Подарочные сертификаты
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://hh.ru/employer/4307094" role="button">Вакансии
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://b2b.hexlet.io" data-target="_blank" role="button">Компаниям
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://hexly.ru/" data-target="_blank" role="button">Колледж
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://hexlyschool.ru/" data-target="_blank" role="button">Частная школа
</span></li>
</ul>
</li>
<li><a class="nav-link" href="/subscription/new">Подписка</a></li>
</ul>
<ul class="navbar-nav flex-lg-row align-items-lg-center gap-2 ms-auto">
<li>
<a class="nav-link" aria-label="Переключить тему" href="/theme/switch?new_theme=dark"><span aria-hidden="true" class="bi bi-moon"></span>
</a></li>
<li>
<span data-target="_self" class="nav-link external-link" data-href="/u/new" role="button"><span>Регистрация</span>
</span></li>
<li>
<span data-target="_self" class="nav-link external-link" data-href="https://ru.hexlet.io/session/new" role="button"><span>Вход</span>
</span></li>
</ul>
</div>
</div>
</nav>
</header>
<div class="x-container-xxxl">
</div>
<main class="mb-6 min-vh-100 h-100">
<link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzk5MiwicHVyIjoiYmxvYl9pZCJ9fQ==--e9d0f30948ea766a7e6bc3e3d56c192344d45fb8/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Programming-cuate%20(1).png"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzcyMSwicHVyIjoiYmxvYl9pZCJ9fQ==--b4d9b4d245e88f43c7f861ac11e675846937c317/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Programmer-bro.png"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NTIxNSwicHVyIjoiYmxvYl9pZCJ9fQ==--ee06f514098550b5ac7eebce6227b1543399a37c/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Hand%20coding-rafiki.png"/><link rel="preload" as="image" href="/vite/assets/development-BVihs_d5.png"/><div id="app" data-page="{"component":"web/courses/lessons/theory_unit","props":{"errors":{},"locale":"ru","language":"ru","httpsHost":"https://ru.hexlet.io","host":"ru.hexlet.io","colorScheme":"light","auth":{"user":{"id":null,"last_viewed_notification_id":null,"email":null,"state":null,"first_name":"","last_name":"","created_at":"2026-02-26T20:10:08.475Z","current_program":null,"current_team":null,"full_name":"","guest":true,"can_use_paid_features":false,"is_hexlet_employee":false,"sanitized_phone_number":"","can_subscribe":true,"can_renew_education":false}},"cloudflareTurnstileSiteKey":"0x4AAAAAAA15KmeFXzd2H0Xo","vkIdClientId":"51586979","yandexIdClientId":"88d071f1d3384eb4bd1deb37910235c7","formAuthToken":"nPIBQdr_rbnmvaLxbWIAAv28Ts97tZwRK6E8uEG6LrdzI8p2KIEA2VD-hmlhbfB1PbVjZXOCYrOWQabsE73J2Q","topics":[{"id":41963,"title":"День добрый. После выполнения команды в Tinker $user->save() выбивает такую ошибку: \nPHP Error: Call to a member function connection() on null in /vendor/illuminate/database/Eloquent/Model.php on line 1285\n\nПодскажите, с чем это может быть связано? \n\n","plain_title":"День добрый. После выполнения команды в Tinker $user->save() выбивает такую ошибку: PHP Error: Call to a member function connection() on null in /vendor/illuminate/database/Eloquent/Model.php on line 1285 Подскажите, с чем это может быть связано? ","creator":{"public_name":"Алексей Лысенко","id":268169,"is_tutor":false},"comments":[{"creator":{"public_name":"Andy Groza","id":206149,"is_tutor":true},"id":91403,"body":"Добрый день. А Вы правильно указали настройки подключения к БД?","topic_id":41963},{"creator":{"public_name":"Andy Groza","id":206149,"is_tutor":true},"id":91484,"body":"А в корне проекта появился файл db.sqlite? Когда запускаете тесты - они выполняются без ошибок?","topic_id":41963},{"creator":{"public_name":"Алексей Лысенко","id":268169,"is_tutor":false},"id":91568,"body":"Спасибо, попробую разобраться, если что - напишу. Пока пошел дальше. На курсе с Laravel всё работает.","topic_id":41963},{"creator":{"public_name":"Andy Groza","id":206149,"is_tutor":true},"id":91563,"body":"Очень странно. Если не получится, напишите, пожалуйста, мне в слак, попробую по телеконсоли подключиться и помочь","topic_id":41963},{"creator":{"public_name":"Алексей Лысенко","id":268169,"is_tutor":false},"id":91524,"body":"Да файл появляется, и тесты без ошибок. Ошибка уже во время выполнения скрипта, метод save не срабатывает. Пока не знаю в чём проблема. Не могу найти закономерность. ","topic_id":41963},{"creator":{"public_name":"Алексей Лысенко","id":268169,"is_tutor":false},"id":91442,"body":"Выполнял всё как в лекции. Наверное проблема с самой базой. Попытаюсь найти место где выбивает. ","topic_id":41963}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Настройка ORM","entity_url":null,"active":true}},{"id":31781,"title":"Не могу закончить данный курс. Добавьте пожалуйста кнопку.","plain_title":"Не могу закончить данный курс. Добавьте пожалуйста кнопку. ","creator":{"public_name":"Александр Лунев","id":139831,"is_tutor":false},"comments":[{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":69070,"body":"Ага, практика будет. Щас немного с силами соберусь и доработаю теорию)","topic_id":31781},{"creator":{"public_name":"Александр Лунев","id":139831,"is_tutor":false},"id":69050,"body":"**Kirill Mokevnin**, конечно не хватает практики. Для более глубокого понимания необходимо хоть какой-то проектик не большой запилить. А так: LIKE!!! Жду продолжения курса.","topic_id":31781},{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":69045,"body":"Он еще не закончен. Кстати есть какие-то места которые надо расширить?","topic_id":31781}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Настройка ORM","entity_url":null,"active":true}},{"id":50100,"title":"Не получается разобраться с PsySH, код из теории падает с ошибкой \n> PHP Parse error: Syntax error, unexpected T_DOUBLE_ARROW on line 1\n\nИ второй вопрос - его в терминале как то можно в несколько строк набирать, как в теории он приведен, или в PsySH перевод строки без отправки команды на выполнение невозможно?","plain_title":"Не получается разобраться с PsySH, код из теории падает с ошибкой PHP Parse error: Syntax error, unexpected TDOUBLEARROW on line 1 И второй вопрос - его в терминале как то можно в несколько строк набирать, как в теории он приведен, или в PsySH перевод строки без отправки команды на выполнение невозможно? ","creator":{"public_name":"Vladimir Minkin","id":248254,"is_tutor":false},"comments":[{"creator":{"public_name":"Vladimir Minkin","id":248254,"is_tutor":false},"id":107347,"body":"Если ставлю ; после имени класса:\n\n $user = new App\\Models\\User();\n\nто вижу ошибку \n> PHP Error: Class 'App\\Models\\User' not found in /home/vm/projects/php-eloquent-blogeval()'d code on line 1\n\nС какого файла начинается работа приложения? Команда print_r(__FILE__) отвечает true))","topic_id":50100},{"creator":{"public_name":"Vladimir Minkin","id":248254,"is_tutor":false},"id":107723,"body":"Спасибо большое!!","topic_id":50100},{"creator":{"public_name":"Roman Ashikov","id":226258,"is_tutor":true},"id":107441,"body":"Приветствую!\n\nДело в том, что вышла новая версия Laravel, а вместе с ней обновилась и Eloquent ORM. Теорию и упражнения я обновил, а вот библиотека выпала из поля зрения. Спасибо, что напомнили об этом! Я обновил зависимости в библиотеке, добавил новые неймспейсы в соответствии с документацией Laravel. Теперь модели хранятся в директории Models и пример из теории должен работать. Обновите свою локальную копию библиотеки [php-eloquent-blog](https://github.com/hexlet-components/php-eloquent-blog) и попробуйте поработать в репле. Примеры из теории теперь не вызывают ошибок, я проверил. \n\nВ PsySH можно отправлять и несколько строк сразу, но код должен быть правильно отформатирован. Насколько я понял, вы копировали в репл также и вывод из примеров в теории, поэтому и получали синтаксическую ошибку. Попробуйте скопировать вот эти строки:\n\n $user = new App\\Models\\User();\n $user->email = 'test@email.com';\n $user->save();\n\nВы увидите, что в БД успешно была добавлена запись.\n\n> С какого файла начинается работа приложения?\n\nУточните, пожалуйста, что вы имеете в виду? Не совсем понял вопрос.","topic_id":50100},{"creator":{"public_name":"Roman Ashikov","id":226258,"is_tutor":true},"id":107670,"body":"Спасибо, что пояснили. Взгляните в ридми репозитория. Там написано какие команды вызываются, чтобы сконфигурировать проект и запустить тесты. Попробуйте проследить последовательность выполнения make setup, чтобы понять каким образом всё работает.","topic_id":50100},{"creator":{"public_name":"Vladimir Minkin","id":248254,"is_tutor":false},"id":107623,"body":"**Роман Ашиков**, \n> Насколько я понял, вы копировали в репл также и вывод из примеров в теории, поэтому и получали синтаксическую ошибку.\n\nРукалицо!) Это всё потому что вечером, после работы мозг самопроизвольно отключается(( Ну и в примере из теории (Настройка ORM) после команд нет точки с запятой, - триггер, на который сработал бы мозг)))\n\n> Уточните, пожалуйста, что вы имеете в виду? Не совсем понял вопрос.\n\nЯ пытался понять входную точку приложения - файл, с которого начинается работа, что бы попытаться пробросить неймспейс, на который он жаловался в предыдущий раз","topic_id":50100}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Настройка ORM","entity_url":null,"active":true}},{"id":33956,"title":"Сижу уже несколько часов пытаясь запустить make install\n```\nPHP Warning: PHP Startup: Unable to load dynamic library 'pdo_sqlite' (tried: /usr/lib/php/20170718/pdo_sqlite (/usr/lib/php/20170718/pdo_sqlite: cannot open shared object file: No such file or directory), /usr/lib/php/20170718/pdo_sqlite.so (/usr/lib/php/20170718/pdo_sqlite.so: undefined symbol: php_pdo_unregister_driver)) in Unknown on line 0\n\n```\nПолучаю каждый раз такой текст. Я уже всеми способами поставил sqlite. Ничего не выходит. Гуглил тему, предлагают по-разному ставить и проверить установлен и включен ли sqlite через создание тестовой страницы с выводом phpinfo(). У меня enabled\n","plain_title":"Сижу уже несколько часов пытаясь запустить make install ``` PHP Warning: PHP Startup: Unable to load dynamic library 'pdosqlite' (tried: /usr/lib/php/20170718/pdosqlite (/usr/lib/php/20170718/pdosqlite: cannot open shared object file: No such file or directory), /usr/lib/php/20170718/pdosqlite.so (/usr/lib/php/20170718/pdosqlite.so: undefined symbol: phppdounregisterdriver)) in Unknown on line 0 Получаю каждый раз такой текст. Я уже всеми способами поставил sqlite. Ничего не выходит. Гуглил тему, предлагают по-разному ставить и проверить установлен и включен ли sqlite через создание тестовой страницы с выводом phpinfo(). У меня enabled ","creator":{"public_name":"","id":25421,"is_tutor":false},"comments":[{"creator":{"public_name":"","id":25421,"is_tutor":false},"id":73963,"body":"Вобщем мне помог друг сисадмин. Было поставлено на виртуалке две пыхи. Одну почистил через purge - все заработало","topic_id":33956},{"creator":{"public_name":"","id":25421,"is_tutor":false},"id":73946,"body":"Команда php -m дает такой ответ:\n`\nPHP Warning: PHP Startup: Unable to load dynamic library 'pdo_sqlite' (tried: /usr/lib/php/20170718/pdo_sqlite (/usr/lib/php/20170718/pdo_sqlite: cannot open shared object file: No such file or directory), /usr/lib/php/20170718/pdo_sqlite.so (/usr/lib/php/20170718/pdo_sqlite.so: undefined symbol: php_pdo_unregister_driver)) in Unknown on line 0\n[PHP Modules]\ncalendar\nCore\nctype\ndate\ndom\nexif\nfileinfo\nfilter\nftp\ngettext\nhash\niconv\njson\nlibxml\nmbstring\nmysqli\nmysqlnd\nopenssl\npcntl\npcre\nPDO\npdo_mysql\npdo_sqlite\nPhar\nposix\nreadline\nReflection\nsession\nshmop\nSimpleXML\nsockets\nsodium\nSPL\nsqlite3\nstandard\nsysvmsg\nsysvsem\nsysvshm\ntokenizer\nwddx\nxml\nxmlreader\nxmlwriter\nxsl\nZend OPcache\nzlib\n[Zend Modules]\nZend OPcache`","topic_id":33956},{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":73956,"body":"А что гугл выдает по тому запросу? Вроде там много ссылок.","topic_id":33956}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Настройка ORM","entity_url":null,"active":true}},{"id":31101,"title":"линтер ругается на файл src/setup.php :\n1. `$capsule->setEventDispatcher(new Dispatcher(new Container));` -> `new Container()`\n2. отступы 2 пробела, а не четыре\n```\n$capsule->connection()->listen(function ($query) {\n echo \"\\n\";\n var_dump($query->sql);\n});\n```\n3. и в файле src/factories/PostTagFactory.php лишняя пустая строка в конце\n","plain_title":"линтер ругается на файл src/setup.php : 1. $capsule->setEventDispatcher(new Dispatcher(new Container)); -> new Container() 2. отступы 2 пробела, а не четыре $capsule->connection()->listen(function ($query) { echo \"\\n\"; var_dump($query->sql); }); 3. и в файле src/factories/PostTagFactory.php лишняя пустая строка в конце ","creator":{"public_name":"Валерий Турбанов","id":230983,"is_tutor":false},"comments":[{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":67529,"body":"Спасибо! Поправил.","topic_id":31101}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Настройка ORM","entity_url":null,"active":true}},{"id":34899,"title":"Товарищи! У меня команда make setup не работает( Наверное, потому что Винда у меня? Пишет: \nc:\\OSPanel\\domains\\php-eloquent-blog>make setup\n\"make\" не является внутренней или внешней\nкомандой, исполняемой программой или пакетным файлом. \n\nЧто делать, подскажите плз","plain_title":"Товарищи! У меня команда make setup не работает( Наверное, потому что Винда у меня? Пишет: c:\\OSPanel\\domains\\php-eloquent-blog>make setup \"make\" не является внутренней или внешней командой, исполняемой программой или пакетным файлом. Что делать, подскажите плз ","creator":{"public_name":"Konstantin Grebeniuk","id":241314,"is_tutor":false},"comments":[{"creator":{"public_name":"Maksim Litvinov","id":198906,"is_tutor":true},"id":76141,"body":"Make это утилита в unix подобных операционных системах. В windows ее нет. Соответственно, нужно установить. Если у вас пакетный менеджер chocolatey, наберите \n\n`choco install make.`\n\nИли второй вариант, кардинальный. Установить линукс второй ОС","topic_id":34899},{"creator":{"public_name":"Stanislav Dzisiak","id":212236,"is_tutor":true},"id":76217,"body":"**Konstantin Grebeniuk**, приветствую!\n\nКонечно же лучшим решением была бы установка линукс в качестве второй ОС, как отметил Максим. Если решитесь на этот шаг, порекомендую вам использовать [наш slack чат](https://slack-ru.hexlet.io/). Там вы сможете более оперативно получить ответы на вопросы, которые возможно у вас возникнут по ходу установки.","topic_id":34899}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Настройка ORM","entity_url":null,"active":true}},{"id":76169,"title":"Добрый день! \nУстановил Sqlite3 на Ubuntu 20.02 (WSL2), но когда запускаю `make setup` вылазит вот это:\n\n```\nrushev84@LAPTOP-6QJE1OS0:~/projects/php-eloquent-blog$ make setup\nrm db.sqlite || true\ncomposer install\nInstalling dependencies from lock file (including require-dev)\nVerifying lock file contents can be installed on current platform.\nNothing to install, update or remove\nGenerating autoload files\n41 packages you are using are looking for funding.\nUse the `composer fund` command to find out more!\nphp db-prepare.php\nPHP Fatal error: Uncaught PDOException: could not find driver in /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connectors/Connector.php:70\nStack trace:\n#0 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connectors/Connector.php(70): PDO->__construct()\n#1 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connectors/Connector.php(46): Illuminate\\Database\\Connectors\\Connector->createPdoConnection()\n#2 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connectors/SQLiteConnector.php(37): Illuminate\\Database\\Connectors\\Connector->createConnection()\n#3 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connectors/ConnectionFactory.php(221): Illuminate\\Database\\Connectors\\SQLiteConnector->connect()\n#4 [internal function]: Illuminate\\Database\\Connectors\\ConnectionFactory->Illuminate\\Database\\Connectors\\{closure}()\n#5 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(1169): call_user_func()\n#6 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(485): Illuminate\\Database\\Connection->getPdo()\n#7 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(413): Illuminate\\Database\\Connection->getPdoForSelect()\n#8 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(752): Illuminate\\Database\\Connection->Illuminate\\Database\\{closure}()\n#9 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(719): Illuminate\\Database\\Connection->runQueryCallback()\n#10 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(421): Illuminate\\Database\\Connection->run()\n#11 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(391): Illuminate\\Database\\Connection->select()\n#12 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Schema/Builder.php(145): Illuminate\\Database\\Connection->selectFromWriteConnection()\n#13 /home/rushev84/projects/php-eloquent-blog/src/config/schema.php(9): Illuminate\\Database\\Schema\\Builder->hasTable()\n#14 /home/rushev84/projects/php-eloquent-blog/db-prepare.php(9): App\\config\\schema\\load()\n#15 {main}\n\nNext Illuminate\\Database\\QueryException: could not find driver (SQL: select * from sqlite_master where type = 'table' and name = users) in /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connection.php:759\nStack trace:\n#0 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(719): Illuminate\\Database\\Connection->runQueryCallback()\n#1 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(421): Illuminate\\Database\\Connection->run()\n#2 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(391): Illuminate\\Database\\Connection->select()\n#3 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Schema/Builder.php(145): Illuminate\\Database\\Connection->selectFromWriteConnection()\n#4 /home/rushev84/projects/php-eloquent-blog/src/config/schema.php(9): Illuminate\\Database\\Schema\\Builder->hasTable()\n#5 /home/rushev84/projects/php-eloquent-blog/db-prepare.php(9): App\\config\\schema\\load()\n#6 {main}\n thrown in /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connection.php on line 759\nmake: *** [Makefile:13: db-prepare] Error 255\n```\n\nПодскажите, что означают эти ошибки?","plain_title":"Добрый день! Установил Sqlite3 на Ubuntu 20.02 (WSL2), но когда запускаю make setup вылазит вот это: rushev84@LAPTOP-6QJE1OS0:~/projects/php-eloquent-blog$ make setup rm db.sqlite || true composer install Installing dependencies from lock file (including require-dev) Verifying lock file contents can be installed on current platform. Nothing to install, update or remove Generating autoload files 41 packages you are using are looking for funding. Use the `composer fund` command to find out more! php db-prepare.php PHP Fatal error: Uncaught PDOException: could not find driver in /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connectors/Connector.php:70 Stack trace: #0 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connectors/Connector.php(70): PDO->__construct() #1 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connectors/Connector.php(46): Illuminate\\Database\\Connectors\\Connector->createPdoConnection() #2 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connectors/SQLiteConnector.php(37): Illuminate\\Database\\Connectors\\Connector->createConnection() #3 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connectors/ConnectionFactory.php(221): Illuminate\\Database\\Connectors\\SQLiteConnector->connect() #4 [internal function]: Illuminate\\Database\\Connectors\\ConnectionFactory->Illuminate\\Database\\Connectors\\{closure}() #5 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(1169): call_user_func() #6 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(485): Illuminate\\Database\\Connection->getPdo() #7 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(413): Illuminate\\Database\\Connection->getPdoForSelect() #8 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(752): Illuminate\\Database\\Connection->Illuminate\\Database\\{closure}() #9 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(719): Illuminate\\Database\\Connection->runQueryCallback() #10 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(421): Illuminate\\Database\\Connection->run() #11 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(391): Illuminate\\Database\\Connection->select() #12 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Schema/Builder.php(145): Illuminate\\Database\\Connection->selectFromWriteConnection() #13 /home/rushev84/projects/php-eloquent-blog/src/config/schema.php(9): Illuminate\\Database\\Schema\\Builder->hasTable() #14 /home/rushev84/projects/php-eloquent-blog/db-prepare.php(9): App\\config\\schema\\load() #15 {main} Next Illuminate\\Database\\QueryException: could not find driver (SQL: select * from sqlite_master where type = 'table' and name = users) in /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connection.php:759 Stack trace: #0 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(719): Illuminate\\Database\\Connection->runQueryCallback() #1 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(421): Illuminate\\Database\\Connection->run() #2 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(391): Illuminate\\Database\\Connection->select() #3 /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Schema/Builder.php(145): Illuminate\\Database\\Connection->selectFromWriteConnection() #4 /home/rushev84/projects/php-eloquent-blog/src/config/schema.php(9): Illuminate\\Database\\Schema\\Builder->hasTable() #5 /home/rushev84/projects/php-eloquent-blog/db-prepare.php(9): App\\config\\schema\\load() #6 {main} thrown in /home/rushev84/projects/php-eloquent-blog/vendor/illuminate/database/Connection.php on line 759 make: *** [Makefile:13: db-prepare] Error 255 Подскажите, что означают эти ошибки? ","creator":{"public_name":"Сергей Рушев","id":482117,"is_tutor":false},"comments":[{"creator":{"public_name":"Сергей Рушев","id":482117,"is_tutor":false},"id":158601,"body":"Проблема решена командой `sudo apt-get install php-sqlite3`","topic_id":76169},{"creator":{"public_name":"Roman Ashikov","id":226258,"is_tutor":true},"id":158603,"body":"Отлично!","topic_id":76169}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Настройка ORM","entity_url":null,"active":true}},{"id":31902,"title":"Для тех у кого возникла ошибка\n\n> Uncaught PDOException: could not find driver in /./../php-eloquent-blog/vendor/illuminate/database/Connectors/Connector.php:70\n\nВозможно стоит установить `sqlite` для вашей версии PHP\n\n> `sudo apt install php7.3-sqlite3`\n","plain_title":"Для тех у кого возникла ошибка Uncaught PDOException: could not find driver in /./../php-eloquent-blog/vendor/illuminate/database/Connectors/Connector.php:70 Возможно стоит установить sqlite для вашей версии PHP sudo apt install php7.3-sqlite3 ","creator":{"public_name":"Evgen Guba","id":232968,"is_tutor":false},"comments":[{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":69265,"body":"СПасибо за информацию! Я добавил пояснение в теорию.","topic_id":31902},{"creator":{"public_name":"Игорь Никитин","id":324906,"is_tutor":false},"id":117649,"body":"Теперь, наверное, sudo apt install php7.4-sqlite3","topic_id":31902}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Настройка ORM","entity_url":null,"active":true}},{"id":55179,"title":"Здравствуйте.\nЕсли набрать команду make setup выводится ошибка. Подскажете, как устранить? sqlite3 скачан, установлен. \n\n rm db.sqlite || true\n rm: cannot remove 'db.sqlite': No such file or directory\n composer install\n Installing dependencies from lock file (including require-dev)\n Verifying lock file contents can be installed on current platform.\n Your lock file does not contain a compatible set of packages. Please run composer update.","plain_title":"Здравствуйте. Если набрать команду make setup выводится ошибка. Подскажете, как устранить? sqlite3 скачан, установлен. rm db.sqlite || true rm: cannot remove 'db.sqlite': No such file or directory composer install Installing dependencies from lock file (including require-dev) Verifying lock file contents can be installed on current platform. Your lock file does not contain a compatible set of packages. Please run composer update. ","creator":{"public_name":"Дилянур","id":321193,"is_tutor":false},"comments":[{"creator":{"public_name":"Roman Ashikov","id":226258,"is_tutor":true},"id":117166,"body":"Приведите, пожалуйста, вывод терминала когда вы делаете composer update. Вообще довольно странно, что вам предлагается эта команда. Я специально сам проверил репозиторий, make setup отработал нормально. Можно попробовать сделать вот что: удалите директорию *vendor* в каталоге с проектом и файл *composer.lock*. После этого запустите make setup. \n\nХочу порекомендовать вам для более оперативной помощи обратиться к ребятам в нашем сообществе в Слаке. Там всегда есть народ, в том числе опытные разработчики, которые обязательно вам помогут разобраться. С локальными проблемами бывает сложно и тут очень помогает общение в реальном времени в чате. О том как подключиться к нашему слаку можно узнать в статье: https://help.hexlet.io/ru/articles/111445-soobshchestvo-kheksleta-v-slake","topic_id":55179},{"creator":{"public_name":"Дилянур","id":321193,"is_tutor":false},"id":117127,"body":"**Роман Ашиков**, и его пробовала,\nуказывает на makefile","topic_id":55179},{"creator":{"public_name":"Roman Ashikov","id":226258,"is_tutor":true},"id":117125,"body":"Приветствую!\n\nА вы пробовали запустить *composer update*, как сказано в самом конце вывода в терминал, который вы привели?","topic_id":55179}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Настройка ORM","entity_url":null,"active":true}},{"id":91563,"title":"Почините, пожалуйста, сборку, или добавьте инструкцию как с этим работать, потому что make setup - недостаточно для запуска.\n\n```\ndan@pc:~/Projects/php-eloquent-blog$ make setup\nrm db.sqlite || true\ncomposer install\nInstalling dependencies from lock file (including require-dev)\nVerifying lock file contents can be installed on current platform.\nNothing to install, update or remove\nGenerating autoload files\n42 packages you are using are looking for funding.\nUse the `composer fund` command to find out more!\nphp db-prepare.php\nPHP Fatal error: Uncaught PDOException: could not find driver in /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connectors/Connector.php:70\nStack trace:\n#0 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connectors/Connector.php(70): PDO->__construct()\n#1 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connectors/Connector.php(45): Illuminate\\Database\\Connectors\\Connector->createPdoConnection()\n#2 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connectors/SQLiteConnector.php(37): Illuminate\\Database\\Connectors\\Connector->createConnection()\n#3 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connectors/ConnectionFactory.php(221): Illuminate\\Database\\Connectors\\SQLiteConnector->connect()\n#4 [internal function]: Illuminate\\Database\\Connectors\\ConnectionFactory->Illuminate\\Database\\Connectors\\{closure}()\n#5 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(1181): call_user_func()\n#6 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(486): Illuminate\\Database\\Connection->getPdo()\n#7 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(414): Illuminate\\Database\\Connection->getPdoForSelect()\n#8 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(753): Illuminate\\Database\\Connection->Illuminate\\Database\\{closure}()\n#9 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(720): Illuminate\\Database\\Connection->runQueryCallback()\n#10 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(405): Illuminate\\Database\\Connection->run()\n#11 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(392): Illuminate\\Database\\Connection->select()\n#12 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Schema/Builder.php(162): Illuminate\\Database\\Connection->selectFromWriteConnection()\n#13 /home/dan/Projects/php-eloquent-blog/src/config/schema.php(9): Illuminate\\Database\\Schema\\Builder->hasTable()\n#14 /home/dan/Projects/php-eloquent-blog/db-prepare.php(9): App\\config\\schema\\load()\n#15 {main}\n\nNext Illuminate\\Database\\QueryException: could not find driver (SQL: select * from sqlite_master where type = 'table' and name = users) in /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connection.php:760\nStack trace:\n#0 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(720): Illuminate\\Database\\Connection->runQueryCallback()\n#1 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(405): Illuminate\\Database\\Connection->run()\n#2 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(392): Illuminate\\Database\\Connection->select()\n#3 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Schema/Builder.php(162): Illuminate\\Database\\Connection->selectFromWriteConnection()\n#4 /home/dan/Projects/php-eloquent-blog/src/config/schema.php(9): Illuminate\\Database\\Schema\\Builder->hasTable()\n#5 /home/dan/Projects/php-eloquent-blog/db-prepare.php(9): App\\config\\schema\\load()\n#6 {main}\n thrown in /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connection.php on line 760\nmake: *** [Makefile:13: db-prepare] Error 255\n\n```","plain_title":"Почините, пожалуйста, сборку, или добавьте инструкцию как с этим работать, потому что make setup - недостаточно для запуска. dan@pc:~/Projects/php-eloquent-blog$ make setup rm db.sqlite || true composer install Installing dependencies from lock file (including require-dev) Verifying lock file contents can be installed on current platform. Nothing to install, update or remove Generating autoload files 42 packages you are using are looking for funding. Use the `composer fund` command to find out more! php db-prepare.php PHP Fatal error: Uncaught PDOException: could not find driver in /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connectors/Connector.php:70 Stack trace: #0 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connectors/Connector.php(70): PDO->__construct() #1 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connectors/Connector.php(45): Illuminate\\Database\\Connectors\\Connector->createPdoConnection() #2 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connectors/SQLiteConnector.php(37): Illuminate\\Database\\Connectors\\Connector->createConnection() #3 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connectors/ConnectionFactory.php(221): Illuminate\\Database\\Connectors\\SQLiteConnector->connect() #4 [internal function]: Illuminate\\Database\\Connectors\\ConnectionFactory->Illuminate\\Database\\Connectors\\{closure}() #5 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(1181): call_user_func() #6 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(486): Illuminate\\Database\\Connection->getPdo() #7 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(414): Illuminate\\Database\\Connection->getPdoForSelect() #8 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(753): Illuminate\\Database\\Connection->Illuminate\\Database\\{closure}() #9 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(720): Illuminate\\Database\\Connection->runQueryCallback() #10 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(405): Illuminate\\Database\\Connection->run() #11 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(392): Illuminate\\Database\\Connection->select() #12 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Schema/Builder.php(162): Illuminate\\Database\\Connection->selectFromWriteConnection() #13 /home/dan/Projects/php-eloquent-blog/src/config/schema.php(9): Illuminate\\Database\\Schema\\Builder->hasTable() #14 /home/dan/Projects/php-eloquent-blog/db-prepare.php(9): App\\config\\schema\\load() #15 {main} Next Illuminate\\Database\\QueryException: could not find driver (SQL: select * from sqlite_master where type = 'table' and name = users) in /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connection.php:760 Stack trace: #0 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(720): Illuminate\\Database\\Connection->runQueryCallback() #1 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(405): Illuminate\\Database\\Connection->run() #2 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connection.php(392): Illuminate\\Database\\Connection->select() #3 /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Schema/Builder.php(162): Illuminate\\Database\\Connection->selectFromWriteConnection() #4 /home/dan/Projects/php-eloquent-blog/src/config/schema.php(9): Illuminate\\Database\\Schema\\Builder->hasTable() #5 /home/dan/Projects/php-eloquent-blog/db-prepare.php(9): App\\config\\schema\\load() #6 {main} thrown in /home/dan/Projects/php-eloquent-blog/vendor/illuminate/database/Connection.php on line 760 make: *** [Makefile:13: db-prepare] Error 255 ","creator":{"public_name":"Денис Каракчиев","id":496877,"is_tutor":false},"comments":[{"creator":{"public_name":"Nikolai Gagarinov","id":104929,"is_tutor":true},"id":181101,"body":"Денис, добрый день.\n\nСообщение говорит о том, что у вас не установлен Sqlite3. У вас стоит соответствующий драйвер/модуль?\n\nЧто выедет команда `php -m | grep sql`?\n","topic_id":91563}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Настройка ORM","entity_url":null,"active":true}}],"lesson":{"exercise":null,"units":[{"id":3172,"name":"theory","url":"/courses/php-orm-eloquent/lessons/setup/theory_unit"},{"id":13306,"name":"quiz","url":"/courses/php-orm-eloquent/lessons/setup/quiz_unit"}],"links":[{"id":423189,"name":"Репозиторий для экспериментов (PHP Eloquent Blog)","url":"https://github.com/hexlet-components/php-eloquent-blog"}],"ordered_units":[{"id":3172,"name":"theory","url":"/courses/php-orm-eloquent/lessons/setup/theory_unit"},{"id":13306,"name":"quiz","url":"/courses/php-orm-eloquent/lessons/setup/quiz_unit"}],"id":1496,"slug":"setup","state":"approved","name":"Настройка ORM","course_order":150,"goal":"Заводим подготовленный пакет с ORM у себя на локальном компьютере","self_study":"1. Выполните шаги указанные в уроке.\n1. Изучите исходный код конфигурационных файлов.\n","theory_video_provider":null,"theory_video_uid":null,"theory":"Этот курс состоит из двух видов практик. Одна выполняется в редакторе Хекслета, другая — на собственном компьютере. Для работы последней, нужно настроить Composer и подключить ORM. Этот процесс достаточно сложен даже для опытного разработчика, поэтому мы пойдём простым путём. Вам будет необходимо склонировать к себе готовый репозиторий и проверить его работоспособность:\n\n```bash\ngit clone https://github.com/hexlet-components/php-eloquent-blog\ncd php-eloquent-blog\nmake setup # установка зависимостей\nmake test # запуск тестов\n\n# тут побегут SQL-запросы\nOK (2 tests, 2 assertions)\n```\n\n_Если на этом этапе вы увидите ошибки, то с большой вероятностью у вас не установлена поддержка SQLite в PHP. Чтобы её включить, вам нужно найти пакет, необходимый для вашей версии операционной системы и PHP. Для этого попробуйте набрать в гугл: \"php install sqlite <тут название вашей операционной системы>\"_\n\nВ качестве базы данных в этом проекте используется SQLite. Такой выбор никак не влияет на работу с ORM, но значительно упрощает настройку и запуск кода на выполнение. SQLite в отличие от больших СУБД, хранится в одном файле и работает напрямую из кода. Под неё не поднимается отдельное приложение в системе.\n\n## Основные части репозитория\n\n* _src/_ – Здесь лежат модели и фабрики. Это основные элементы ORM. Подробнее о них дальше по курсу.\n* _tests/_ – Все сценарии работы с ORM описаны в виде тестов.\n* _composer.json_ – Содержит библиотеки, необходимые для работы Eloquent.\n* _src/config/loaders.php_ – В этом файле находится вся конфигурация. Функция `bootstrap()` создает файл для базы данных и инициализирует Eloquent. После выполнения этого метода, ORM готова к использованию.\n* _db-prepare.php_ – Файл, запускаемый во время настройки сетапа. Он пересоздает базу данных и загружает туда тестовые данные.\n* _src/config/schema.php_ – Содержит схему базы данных.\n* _tests/BaseTest.php_ – базовый класс для тестов. Внутри него происходит настройка приложения.\n\n## REPL (PsySH)\n\nЛучший способ \"поиграться\" с кодом данного проекта – использовать [PsySH](https://psysh.org/). С его помощью можно загрузить приложение в память, запустить интерпретатор и вызывать любой код приложения прямо из командной строки, взаимодействуя с базой данных. PsySH работает как для самостоятельной работы, так и в практике на сайте. Для его запуска наберите:\n\n```bash\nmake console\n\n./vendor/bin/psysh\nPsy Shell v0.9.9 (PHP 7.3.8 — cli) by Justin Hileman\n>>>\n```\n\nЕсли на экране появилось приглашение для ввода `>>>` значит всё получилось. Вы находитесь внутри PsySH и можете работать с приложением. Попробуйте набрать следующий код (он будет объясняться дальше по курсу):\n\n```bash\n# Создание нового объекта пользователя\n>>> $user = new App\\Models\\User()\n=> App\\Models\\User {#2394\n +incrementing: true,\n +exists: false,\n +wasRecentlyCreated: false,\n +timestamps: true,\n }\n# Установка email\n>>> $user->email = 'test@email.com'\n=> \"test@email.com\"\n# Сохранение в базу\n>>> $user->save()\n\nstring(74) \"insert into \"users\" (\"email\", \"updated_at\", \"created_at\") values (?, ?, ?)\"\n=> true\n```\n\nВ последующих уроках будет много примеров кода. Не забывайте запускать репл и выполнять его там. Это поможет лучше разобраться с материалом и закрепить его на практике.\n"},"lessonMember":null,"courseMember":null,"course":{"start_lesson":{"exercise":null,"units":[{"id":3162,"name":"theory","url":"/courses/php-orm-eloquent/lessons/about/theory_unit"}],"links":[{"id":423188,"name":"Eloquent","url":"https://laravel.com/docs/10.x/eloquent"}],"ordered_units":[{"id":3162,"name":"theory","url":"/courses/php-orm-eloquent/lessons/about/theory_unit"}],"id":1486,"slug":"about","state":"approved","name":"О курсе","course_order":10,"goal":"Знакомимся с целями и задачами курса","self_study":null,"theory_video_provider":null,"theory_video_uid":null,"theory":"В основе любой программы лежит какая-то определённая предметная область. Например, графический редактор имеет дело с геометрическими примитивами, такими как отрезки, круги или квадраты, а сервисы доставки еды занимаются логистикой.\n\nПредметная область включает в себя набор сущностей, которые взаимодействуют друг с другом, а также правила их взаимодействия, называемые бизнес-логикой. Правила, работающие в конкретной предметной области, никак не связаны ни с языком, ни с фреймворком, на которых пишется программа. Более того, они вообще не имеют никакого отношения к программированию и существуют независимо.\n\nВозьмём для примера Хекслет. Это проект, построенный вокруг обучения. Его предметная область включает множество сущностей, часть из которых используется в проекте. К ним относятся понятия: Профессия, Курс, Проект, Урок, Практика, Квиз. Это лишь малая часть понятий из того, что реализовано. Всего на Хекслете более 300 таких сущностей. Все они подчиняются определённым бизнес-правилам, которые реализованы в коде. Например, пользователь не может одновременно вступать сразу в несколько профессий и должен иметь оплаченную подписку для доступа к профессиональным курсам. Таких правил в проектах сотни и тысячи. Во многом именно они определяют сложность кода.\n\nДля упрощения описания предметной области и хранения её данных в приложениях применяют ORM. Это специализированные фреймворки, которые определяют способ создания сущностей и их связывания. Вторая большая задача этих фреймворков – обеспечивать хранение данных, создаваемых в процессе работы.\n\nЭтот курс посвящён изучению основных концепций ORM. К ним относятся:\n\n* Миграции и схема\n* Модели и связи\n* Работа с формами\n* Динамические запросы и их построение\n* Обработка коллекций\n* Историчность\n* Мягкое удаление\n"},"id":189,"slug":"php-orm-eloquent","challenges_count":3,"name":"PHP: Eloquent (ORM)","allow_indexing":true,"state":"approved","course_state":"finished","pricing_type":"paid","description":"На этом курсе вы глубже познакомитесь с Eloquent ORM. Вы узнаете о общих концепциях, которые свойствены всем ORM на примере Eloquent (Входит в состав Laravel). В итоге поймете, где сосредоточена предметная область проекта, его бизнес-логика и связь с хранилищем. Знание материала этого курса пригодится, чтобы эффективно обрабатывать возвращаемые наборы данных и строить разные виды связей между таблицами в БД.","kind":"basic","updated_at":"2026-01-20T11:41:58.739Z","language":"php","duration_cache":35940,"skills":["Научитесь использовать Eloquent ORM для эффективной работы с базой данных и обработки возвращаемых наборов данных","Приобретете навык построения различных типов связей между таблицами в базе данных с использованием Eloquent ORM","Поймете, как использование Eloquent ORM помогает определить структуру проекта, его бизнес-логику и взаимосвязи с базой данных"],"keywords":[],"lessons_count":10,"cover":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NjUwMSwicHVyIjoiYmxvYl9pZCJ9fQ==--8143e637174222867356720b27ddac54dccfafb6/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fZmlsbCI6WzYwMCw0MDBdfSwicHVyIjoidmFyaWF0aW9uIn19--6067466c2912ca31a17eddee04b8cf2a38c6ad17/image.png"},"recommendedLandings":[{"stack":{"id":2,"slug":"php","title":"PHP-разработчик","audience":"for_beginners","start_type":"weekly","pricing_model":"purchase","priority":"high","kind":"profession","state":"published","stack_state":"finished","order":60,"duration_in_months":10},"id":1,"slug":"php","title":"РНР-разработчик","subtitle":"Изучите PHP и Laravel для разработки и проектирования REST API","subtitle_for_lists":"Изучите PHP и Laravel для разработки и проектирования REST API","locale":"ru","current":true,"duration_in_months_text":"10 месяцев","stack_slug":"php","price_text":"от 5 650 ₽","duration_text":"10 месяцев","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzk5MiwicHVyIjoiYmxvYl9pZCJ9fQ==--e9d0f30948ea766a7e6bc3e3d56c192344d45fb8/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Programming-cuate%20(1).png"},{"stack":{"id":22,"slug":"php-laravel-development","title":"Laravel","audience":"for_programmers","start_type":"anytime","pricing_model":"subscription","priority":"medium","kind":"track","state":"published","stack_state":"finished","order":250,"duration_in_months":1},"id":32,"slug":"php-laravel-developer","title":"Laravel","subtitle":"Laravel — Навык создания веб-приложений с помощью Laravel, необходимый для старта карьеры PHP-разработчика","subtitle_for_lists":"Изучите фреймворк Laravel для создания веб-приложений","locale":"ru","current":true,"duration_in_months_text":"1 месяц","stack_slug":"php-laravel-development","price_text":"от 3 900 ₽","duration_text":"1 месяц","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzcyMSwicHVyIjoiYmxvYl9pZCJ9fQ==--b4d9b4d245e88f43c7f861ac11e675846937c317/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Programmer-bro.png"},{"stack":{"id":468,"slug":"middle-php","title":"Middle-php разработчик","audience":"for_programmers","start_type":"weekly","pricing_model":"purchase","priority":"high","kind":"profession","state":"published","stack_state":"not_finished","order":2003,"duration_in_months":5},"id":596,"slug":"middle-php","title":"Middle-php разработчик","subtitle":"Освоите продвинутую работу с БД и серверной логикой","subtitle_for_lists":"Освоите продвинутую работу с БД и серверной логикой","locale":"ru","current":true,"duration_in_months_text":"5 месяцев","stack_slug":"middle-php","price_text":"от 4 050 ₽","duration_text":"5 месяцев","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NTIxNSwicHVyIjoiYmxvYl9pZCJ9fQ==--ee06f514098550b5ac7eebce6227b1543399a37c/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Hand%20coding-rafiki.png"}],"lessonMemberUnit":null,"accessToLearnUnitExists":false,"accessToCourseExists":false},"url":"/courses/php-orm-eloquent/lessons/setup/theory_unit","version":"8f286f6358a90a7bef2263b3a6edf5a90a94fa42","encryptHistory":false,"clearHistory":false}"><style data-mantine-styles="true">:root, :host{--mantine-font-family: Arial, sans-serif;--mantine-font-family-headings: Arial, sans-serif;--mantine-heading-font-weight: normal;--mantine-radius-default: 0rem;--mantine-primary-color-filled: var(--mantine-color-indigo-filled);--mantine-primary-color-filled-hover: var(--mantine-color-indigo-filled-hover);--mantine-primary-color-light: var(--mantine-color-indigo-light);--mantine-primary-color-light-hover: var(--mantine-color-indigo-light-hover);--mantine-primary-color-light-color: var(--mantine-color-indigo-light-color);--mantine-spacing-xxl: calc(4rem * var(--mantine-scale));--mantine-font-size-xs: 12px;--mantine-font-size-sm: 14px;--mantine-font-size-md: 16px;--mantine-font-size-lg: clamp(16.0000px, calc(15.2727px + 0.2273vw), 18.0000px);--mantine-font-size-xl: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-font-size-display-3: clamp(32.0000px, calc(26.1818px + 1.8182vw), 48.0000px);--mantine-font-size-display-2: clamp(36.0000px, calc(25.8182px + 3.1818vw), 64.0000px);--mantine-font-size-display-1: clamp(40.0000px, calc(25.4545px + 4.5455vw), 80.0000px);--mantine-font-size-h1: clamp(28.0000px, calc(23.6364px + 1.3636vw), 40.0000px);--mantine-font-size-h2: clamp(24.0000px, calc(21.0909px + 0.9091vw), 32.0000px);--mantine-font-size-h3: clamp(20.0000px, calc(17.0909px + 0.9091vw), 28.0000px);--mantine-font-size-h4: clamp(16.0000px, calc(13.0909px + 0.9091vw), 24.0000px);--mantine-font-size-h5: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-font-size-h6: 1rem;--mantine-primary-color-0: var(--mantine-color-indigo-0);--mantine-primary-color-1: var(--mantine-color-indigo-1);--mantine-primary-color-2: var(--mantine-color-indigo-2);--mantine-primary-color-3: var(--mantine-color-indigo-3);--mantine-primary-color-4: var(--mantine-color-indigo-4);--mantine-primary-color-5: var(--mantine-color-indigo-5);--mantine-primary-color-6: var(--mantine-color-indigo-6);--mantine-primary-color-7: var(--mantine-color-indigo-7);--mantine-primary-color-8: var(--mantine-color-indigo-8);--mantine-primary-color-9: var(--mantine-color-indigo-9);--mantine-color-red-0: #ffeaea;--mantine-color-red-1: #fed4d4;--mantine-color-red-2: #f4a7a8;--mantine-color-red-3: #ec7878;--mantine-color-red-4: #e55050;--mantine-color-red-5: #e03131;--mantine-color-red-6: #e02829;--mantine-color-red-7: #c71a1c;--mantine-color-red-8: #b21218;--mantine-color-red-9: #9c0411;--mantine-color-violet-0: #fce9ff;--mantine-color-violet-1: #f1cfff;--mantine-color-violet-2: #e09bff;--mantine-color-violet-3: #d16fff;--mantine-color-violet-4: #be37fe;--mantine-color-violet-5: #b51afe;--mantine-color-violet-6: #b009ff;--mantine-color-violet-7: #9b00e4;--mantine-color-violet-8: #8a00cc;--mantine-color-violet-9: #7800b3;--mantine-color-indigo-0: #edecff;--mantine-color-indigo-1: #d6d5fe;--mantine-color-indigo-2: #aaa9f4;--mantine-color-indigo-3: #7b79eb;--mantine-color-indigo-4: #5451e4;--mantine-color-indigo-5: #3b37e0;--mantine-color-indigo-6: #2d2adf;--mantine-color-indigo-7: #1f1ec7;--mantine-color-indigo-8: #1819b2;--mantine-color-indigo-9: #0c149e;--mantine-color-cyan-0: #dffdff;--mantine-color-cyan-1: #caf5ff;--mantine-color-cyan-2: #99e8ff;--mantine-color-cyan-3: #64daff;--mantine-color-cyan-4: #3ccffe;--mantine-color-cyan-5: #24c8fe;--mantine-color-cyan-6: #00c2ff;--mantine-color-cyan-7: #00ade4;--mantine-color-cyan-8: #009acd;--mantine-color-cyan-9: #0085b5;--mantine-color-green-0: #e9fdec;--mantine-color-green-1: #d7f6dc;--mantine-color-green-2: #b0eab9;--mantine-color-green-3: #86df94;--mantine-color-green-4: #62d574;--mantine-color-green-5: #4ccf5f;--mantine-color-green-6: #3fcc54;--mantine-color-green-7: #2fb344;--mantine-color-green-8: #25a03b;--mantine-color-green-9: #138a2e;--mantine-color-yellow-0: #fff7e2;--mantine-color-yellow-1: #ffeecd;--mantine-color-yellow-2: #ffdc9c;--mantine-color-yellow-3: #ffc966;--mantine-color-yellow-4: #feb93a;--mantine-color-yellow-5: #feae1e;--mantine-color-yellow-6: #ffa90f;--mantine-color-yellow-8: #ca8200;--mantine-color-yellow-9: #af7000;--mantine-h1-font-size: clamp(28.0000px, calc(23.6364px + 1.3636vw), 40.0000px);--mantine-h1-font-weight: normal;--mantine-h2-font-size: clamp(24.0000px, calc(21.0909px + 0.9091vw), 32.0000px);--mantine-h2-font-weight: normal;--mantine-h3-font-size: clamp(20.0000px, calc(17.0909px + 0.9091vw), 28.0000px);--mantine-h3-font-weight: normal;--mantine-h4-font-size: clamp(16.0000px, calc(13.0909px + 0.9091vw), 24.0000px);--mantine-h4-font-weight: normal;--mantine-h5-font-size: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-h5-font-weight: normal;--mantine-h6-font-size: 1rem;--mantine-h6-font-weight: normal;}
:root[data-mantine-color-scheme="dark"], :host([data-mantine-color-scheme="dark"]){--mantine-color-anchor: var(--mantine-color-text);--mantine-color-dimmed: #495057;--mantine-color-dark-filled: var(--mantine-color-dark-5);--mantine-color-dark-filled-hover: var(--mantine-color-dark-6);--mantine-color-dark-light: rgba(105, 105, 105, 0.15);--mantine-color-dark-light-hover: rgba(105, 105, 105, 0.2);--mantine-color-dark-light-color: var(--mantine-color-dark-0);--mantine-color-dark-outline: var(--mantine-color-dark-1);--mantine-color-dark-outline-hover: rgba(184, 184, 184, 0.05);--mantine-color-gray-filled: var(--mantine-color-gray-5);--mantine-color-gray-filled-hover: var(--mantine-color-gray-6);--mantine-color-gray-light: rgba(222, 226, 230, 0.15);--mantine-color-gray-light-hover: rgba(222, 226, 230, 0.2);--mantine-color-gray-light-color: var(--mantine-color-gray-0);--mantine-color-gray-outline: var(--mantine-color-gray-1);--mantine-color-gray-outline-hover: rgba(241, 243, 245, 0.05);--mantine-color-red-filled: var(--mantine-color-red-5);--mantine-color-red-filled-hover: var(--mantine-color-red-6);--mantine-color-red-light: rgba(236, 120, 120, 0.15);--mantine-color-red-light-hover: rgba(236, 120, 120, 0.2);--mantine-color-red-light-color: var(--mantine-color-red-0);--mantine-color-red-outline: var(--mantine-color-red-1);--mantine-color-red-outline-hover: rgba(254, 212, 212, 0.05);--mantine-color-pink-filled: var(--mantine-color-pink-5);--mantine-color-pink-filled-hover: var(--mantine-color-pink-6);--mantine-color-pink-light: rgba(250, 162, 193, 0.15);--mantine-color-pink-light-hover: rgba(250, 162, 193, 0.2);--mantine-color-pink-light-color: var(--mantine-color-pink-0);--mantine-color-pink-outline: var(--mantine-color-pink-1);--mantine-color-pink-outline-hover: rgba(255, 222, 235, 0.05);--mantine-color-grape-filled: var(--mantine-color-grape-5);--mantine-color-grape-filled-hover: var(--mantine-color-grape-6);--mantine-color-grape-light: rgba(229, 153, 247, 0.15);--mantine-color-grape-light-hover: rgba(229, 153, 247, 0.2);--mantine-color-grape-light-color: var(--mantine-color-grape-0);--mantine-color-grape-outline: var(--mantine-color-grape-1);--mantine-color-grape-outline-hover: rgba(243, 217, 250, 0.05);--mantine-color-violet-filled: var(--mantine-color-violet-5);--mantine-color-violet-filled-hover: var(--mantine-color-violet-6);--mantine-color-violet-light: rgba(209, 111, 255, 0.15);--mantine-color-violet-light-hover: rgba(209, 111, 255, 0.2);--mantine-color-violet-light-color: var(--mantine-color-violet-0);--mantine-color-violet-outline: var(--mantine-color-violet-1);--mantine-color-violet-outline-hover: rgba(241, 207, 255, 0.05);--mantine-color-indigo-filled: var(--mantine-color-indigo-5);--mantine-color-indigo-filled-hover: var(--mantine-color-indigo-6);--mantine-color-indigo-light: rgba(123, 121, 235, 0.15);--mantine-color-indigo-light-hover: rgba(123, 121, 235, 0.2);--mantine-color-indigo-light-color: var(--mantine-color-indigo-0);--mantine-color-indigo-outline: var(--mantine-color-indigo-1);--mantine-color-indigo-outline-hover: rgba(214, 213, 254, 0.05);--mantine-color-blue-filled: var(--mantine-color-blue-5);--mantine-color-blue-filled-hover: var(--mantine-color-blue-6);--mantine-color-blue-light: rgba(116, 192, 252, 0.15);--mantine-color-blue-light-hover: rgba(116, 192, 252, 0.2);--mantine-color-blue-light-color: var(--mantine-color-blue-0);--mantine-color-blue-outline: var(--mantine-color-blue-1);--mantine-color-blue-outline-hover: rgba(208, 235, 255, 0.05);--mantine-color-cyan-filled: var(--mantine-color-cyan-5);--mantine-color-cyan-filled-hover: var(--mantine-color-cyan-6);--mantine-color-cyan-light: rgba(100, 218, 255, 0.15);--mantine-color-cyan-light-hover: rgba(100, 218, 255, 0.2);--mantine-color-cyan-light-color: var(--mantine-color-cyan-0);--mantine-color-cyan-outline: var(--mantine-color-cyan-1);--mantine-color-cyan-outline-hover: rgba(202, 245, 255, 0.05);--mantine-color-teal-filled: var(--mantine-color-teal-5);--mantine-color-teal-filled-hover: var(--mantine-color-teal-6);--mantine-color-teal-light: rgba(99, 230, 190, 0.15);--mantine-color-teal-light-hover: rgba(99, 230, 190, 0.2);--mantine-color-teal-light-color: var(--mantine-color-teal-0);--mantine-color-teal-outline: var(--mantine-color-teal-1);--mantine-color-teal-outline-hover: rgba(195, 250, 232, 0.05);--mantine-color-green-filled: var(--mantine-color-green-5);--mantine-color-green-filled-hover: var(--mantine-color-green-6);--mantine-color-green-light: rgba(134, 223, 148, 0.15);--mantine-color-green-light-hover: rgba(134, 223, 148, 0.2);--mantine-color-green-light-color: var(--mantine-color-green-0);--mantine-color-green-outline: var(--mantine-color-green-1);--mantine-color-green-outline-hover: rgba(215, 246, 220, 0.05);--mantine-color-lime-filled: var(--mantine-color-lime-5);--mantine-color-lime-filled-hover: var(--mantine-color-lime-6);--mantine-color-lime-light: rgba(192, 235, 117, 0.15);--mantine-color-lime-light-hover: rgba(192, 235, 117, 0.2);--mantine-color-lime-light-color: var(--mantine-color-lime-0);--mantine-color-lime-outline: var(--mantine-color-lime-1);--mantine-color-lime-outline-hover: rgba(233, 250, 200, 0.05);--mantine-color-yellow-filled: var(--mantine-color-yellow-5);--mantine-color-yellow-filled-hover: var(--mantine-color-yellow-6);--mantine-color-yellow-light: rgba(255, 201, 102, 0.15);--mantine-color-yellow-light-hover: rgba(255, 201, 102, 0.2);--mantine-color-yellow-light-color: var(--mantine-color-yellow-0);--mantine-color-yellow-outline: var(--mantine-color-yellow-1);--mantine-color-yellow-outline-hover: rgba(255, 238, 205, 0.05);--mantine-color-orange-filled: var(--mantine-color-orange-5);--mantine-color-orange-filled-hover: var(--mantine-color-orange-6);--mantine-color-orange-light: rgba(255, 192, 120, 0.15);--mantine-color-orange-light-hover: rgba(255, 192, 120, 0.2);--mantine-color-orange-light-color: var(--mantine-color-orange-0);--mantine-color-orange-outline: var(--mantine-color-orange-1);--mantine-color-orange-outline-hover: rgba(255, 232, 204, 0.05);--app-cta-gradient: linear-gradient(90deg, var(--mantine-color-blue-9) 0%, var(--mantine-color-cyan-7) 100%);--app-color-surface: #2e2e2e;}
:root[data-mantine-color-scheme="light"], :host([data-mantine-color-scheme="light"]){--mantine-color-anchor: var(--mantine-color-text);--mantine-color-dimmed: #495057;--mantine-color-red-light: rgba(224, 40, 41, 0.1);--mantine-color-red-light-hover: rgba(224, 40, 41, 0.12);--mantine-color-red-outline-hover: rgba(224, 40, 41, 0.05);--mantine-color-violet-light: rgba(176, 9, 255, 0.1);--mantine-color-violet-light-hover: rgba(176, 9, 255, 0.12);--mantine-color-violet-outline-hover: rgba(176, 9, 255, 0.05);--mantine-color-indigo-light: rgba(45, 42, 223, 0.1);--mantine-color-indigo-light-hover: rgba(45, 42, 223, 0.12);--mantine-color-indigo-outline-hover: rgba(45, 42, 223, 0.05);--mantine-color-cyan-light: rgba(0, 194, 255, 0.1);--mantine-color-cyan-light-hover: rgba(0, 194, 255, 0.12);--mantine-color-cyan-outline-hover: rgba(0, 194, 255, 0.05);--mantine-color-green-light: rgba(63, 204, 84, 0.1);--mantine-color-green-light-hover: rgba(63, 204, 84, 0.12);--mantine-color-green-outline-hover: rgba(63, 204, 84, 0.05);--mantine-color-yellow-light: rgba(255, 169, 15, 0.1);--mantine-color-yellow-light-hover: rgba(255, 169, 15, 0.12);--mantine-color-yellow-outline-hover: rgba(255, 169, 15, 0.05);--app-color-surface: #f1f3f5;--app-cta-gradient: linear-gradient(90deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-5) 100%);}</style><style data-mantine-styles="classes">@media (max-width: 35.99375em) {.mantine-visible-from-xs {display: none !important;}}@media (min-width: 36em) {.mantine-hidden-from-xs {display: none !important;}}@media (max-width: 47.99375em) {.mantine-visible-from-sm {display: none !important;}}@media (min-width: 48em) {.mantine-hidden-from-sm {display: none !important;}}@media (max-width: 61.99375em) {.mantine-visible-from-md {display: none !important;}}@media (min-width: 62em) {.mantine-hidden-from-md {display: none !important;}}@media (max-width: 74.99375em) {.mantine-visible-from-lg {display: none !important;}}@media (min-width: 75em) {.mantine-hidden-from-lg {display: none !important;}}@media (max-width: 87.99375em) {.mantine-visible-from-xl {display: none !important;}}@media (min-width: 88em) {.mantine-hidden-from-xl {display: none !important;}}</style><div style="position:absolute;top:0rem" class=""></div><div style="max-width:var(--container-size-xl);height:100%;min-height:0rem" class=""><style data-mantine-styles="inline">.__m__-_R_5ub_{--grid-gutter:0rem;}</style><div style="height:100%;min-height:0rem" class="m_410352e9 mantine-Grid-root __m__-_R_5ub_"><div class="m_dee7bd2f mantine-Grid-inner" style="height:100%"><style data-mantine-styles="inline">.__m__-_R_rdub_{--col-flex-grow:auto;--col-flex-basis:91.66666666666667%;--col-max-width:91.66666666666667%;}@media(min-width: 48em){.__m__-_R_rdub_{--col-flex-grow:auto;--col-flex-basis:83.33333333333334%;--col-max-width:83.33333333333334%;}}</style><div style="min-width:0rem;height:100%;min-height:0rem;display:flex" class="m_96bdd299 mantine-Grid-col __m__-_R_rdub_"><style data-mantine-styles="inline">.__m__-_R_6qrdub_{margin-top:0rem;padding-inline:var(--mantine-spacing-xs);width:100%;}@media(min-width: 48em){.__m__-_R_6qrdub_{margin-top:var(--mantine-spacing-xl);width:80%;}}@media(min-width: 62em){.__m__-_R_6qrdub_{padding-inline:var(--mantine-spacing-xl);}}</style><div style="margin-inline:auto;max-width:var(--mantine-breakpoint-xl)" class="__m__-_R_6qrdub_"><div style="color:var(--mantine-color-dimmed)" class="m_4451eb3a mantine-Center-root" data-inline="true"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-inline-end:calc(0.125rem * var(--mantine-scale));color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-lock "><path d="M5 13a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v6a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-6"></path><path d="M11 16a1 1 0 1 0 2 0a1 1 0 0 0 -2 0"></path><path d="M8 11v-4a4 4 0 1 1 8 0v4"></path></svg></div><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">PHP: Eloquent (ORM)</p></div><h1 style="--title-fw:var(--mantine-h1-font-weight);--title-lh:var(--mantine-h1-line-height);--title-fz:var(--mantine-h1-font-size);margin-bottom:var(--mantine-spacing-xl)" class="m_8a5d1357 mantine-Title-root" data-order="1">Теория: Настройка ORM</h1><script type="application/ld+json">{"@context":"https://schema.org","@type":"LearningResource","name":"Настройка ORM","inLanguage":"ru","isPartOf":{"@type":"LearningResource","name":"PHP: Eloquent (ORM)"},"isAccessibleForFree":"False","hasPart":{"@type":"WebPageElement","isAccessibleForFree":"False","cssSelector":".paywalled"}}</script><div class=""><div style="--alert-color:var(--mantine-color-indigo-light-color);margin-bottom:var(--mantine-spacing-lg);font-size:var(--mantine-font-size-lg)" class="m_66836ed3 mantine-Alert-root" id="mantine-_R_remqrdub_" role="alert" aria-describedby="mantine-_R_remqrdub_-body" aria-labelledby="mantine-_R_remqrdub_-title"><div class="m_a5d60502 mantine-Alert-wrapper"><div class="m_667f2a6a mantine-Alert-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-rocket "><path d="M4 13a8 8 0 0 1 7 7a6 6 0 0 0 3 -5a9 9 0 0 0 6 -8a3 3 0 0 0 -3 -3a9 9 0 0 0 -8 6a6 6 0 0 0 -5 3"></path><path d="M7 14a6 6 0 0 0 -3 6a6 6 0 0 0 6 -3"></path><path d="M14 9a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path></svg></div><div class="m_667c2793 mantine-Alert-body"><div class="m_6a03f287 mantine-Alert-title"><span id="mantine-_R_remqrdub_-title" class="m_698f4f23 mantine-Alert-label">Полный доступ к материалам</span></div><div id="mantine-_R_remqrdub_-body" class="m_7fa78076 mantine-Alert-message"><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Зарегистрируйтесь и получите доступ к этому и десяткам других курсов</p><a style="--button-height:var(--button-height-xs);--button-padding-x:var(--button-padding-x-xs);--button-fz:var(--mantine-font-size-xs);--button-bg:linear-gradient(45deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-filled) 100%);--button-hover:linear-gradient(45deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-filled) 100%);--button-color:var(--mantine-color-white);--button-bd:none" class="mantine-focus-auto mantine-active m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-variant="gradient" data-size="xs" href="/u/new"><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">Зарегистрироваться</span></span></a></div></div></div></div></div><div class="paywalled m_d08caa0 mantine-Typography-root"><p>Этот курс состоит из двух видов практик. Одна выполняется в редакторе Хекслета, другая — на собственном компьютере. Для работы последней, нужно настроить Composer и подключить ORM. Этот процесс достаточно сложен даже для опытного разработчика, поэтому мы пойдём простым путём. Вам будет необходимо склонировать к себе готовый репозиторий и проверить его работоспособность:</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">git clone https://github.com/hexlet-components/php-eloquent-blog
cd php-eloquent-blog
make setup # установка зависимостей
make test # запуск тестов
# тут побегут SQL-запросы
OK (2 tests, 2 assertions)</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<p><em>Если на этом этапе вы увидите ошибки, то с большой вероятностью у вас не установлена поддержка SQLite в PHP. Чтобы её включить, вам нужно найти пакет, необходимый для вашей версии операционной системы и PHP. Для этого попробуйте набрать в гугл: "php install sqlite <тут название вашей операционной системы>"</em></p>
<p>В качестве базы данных в этом проекте используется SQLite. Такой выбор никак не влияет на работу с ORM, но значительно упрощает настройку и запуск кода на выполнение. SQLite в отличие от больших СУБД, хранится в одном файле и работает напрямую из кода. Под неё не поднимается отдельное приложение в системе.</p>
<h2 id="heading-2-1">Основные части репозитория</h2>
<ul>
<li><em>src/</em> – Здесь лежат модели и фабрики. Это основные элементы ORM. Подробнее о них дальше по курсу.</li>
<li><em>tests/</em> – Все сценарии работы с ORM описаны в виде тестов.</li>
<li><em>composer.json</em> – Содержит библиотеки, необходимые для работы Eloquent.</li>
<li><em>src/config/loaders.php</em> – В этом файле находится вся конфигурация. Функция <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">bootstrap()</code> создает файл для базы данных и инициализирует Eloquent. После выполнения этого метода, ORM готова к использованию.</li>
<li><em>db-prepare.php</em> – Файл, запускаемый во время настройки сетапа. Он пересоздает базу данных и загружает туда тестовые данные.</li>
<li><em>src/config/schema.php</em> – Содержит схему базы данных.</li>
<li><em>tests/BaseTest.php</em> – базовый класс для тестов. Внутри него происходит настройка приложения.</li>
</ul>
<h2 id="heading-2-2">REPL (PsySH)</h2>
<p>Лучший способ "поиграться" с кодом данного проекта – использовать <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://psysh.org/" rel="noopener noreferrer" target="_blank">PsySH</a>. С его помощью можно загрузить приложение в память, запустить интерпретатор и вызывать любой код приложения прямо из командной строки, взаимодействуя с базой данных. PsySH работает как для самостоятельной работы, так и в практике на сайте. Для его запуска наберите:</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">make console
./vendor/bin/psysh
Psy Shell v0.9.9 (PHP 7.3.8 — cli) by Justin Hileman
>>></code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<p>Если на экране появилось приглашение для ввода <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">>>></code> значит всё получилось. Вы находитесь внутри PsySH и можете работать с приложением. Попробуйте набрать следующий код (он будет объясняться дальше по курсу):</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code"># Создание нового объекта пользователя
>>> $user = new App\Models\User()
=> App\Models\User {#2394
+incrementing: true,
+exists: false,
+wasRecentlyCreated: false,
+timestamps: true,
}
# Установка email
>>> $user->email = 'test@email.com'
=> "test@email.com"
# Сохранение в базу
>>> $user->save()
string(74) "insert into "users" ("email", "updated_at", "created_at") values (?, ?, ?)"
=> true</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<p>В последующих уроках будет много примеров кода. Не забывайте запускать репл и выполнять его там. Это поможет лучше разобраться с материалом и закрепить его на практике.</p></div><div style="margin-block:var(--mantine-spacing-xl)" class=""><h2 style="--title-fw:var(--mantine-h2-font-weight);--title-lh:var(--mantine-h2-line-height);--title-fz:var(--mantine-h2-font-size);margin-bottom:var(--mantine-spacing-md)" class="m_8a5d1357 mantine-Title-root" data-order="2">Рекомендуемые программы</h2><style data-mantine-styles="inline">.__m__-_R_2mremqrdub_{--carousel-slide-gap:var(--mantine-spacing-xs);--carousel-slide-size:70%;}@media(min-width: 36em){.__m__-_R_2mremqrdub_{--carousel-slide-gap:var(--mantine-spacing-xl);--carousel-slide-size:50%;}}</style><div style="--carousel-control-size:calc(2.5rem * var(--mantine-scale));--carousel-controls-offset:var(--mantine-spacing-sm);margin-bottom:var(--mantine-spacing-lg);padding-block:var(--mantine-spacing-sm);background:var(--app-color-surface)" class="m_17884d0f mantine-Carousel-root responsiveClassName" data-orientation="horizontal" data-include-gap-in-size="true"><div class="m_39bc3463 mantine-Carousel-controls" data-orientation="horizontal"><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="previous" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="next" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(-90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button></div><div class="m_a2dae653 mantine-Carousel-viewport" data-type="media"><div class="m_fcd81474 mantine-Carousel-container __m__-_R_2mremqrdub_" data-orientation="horizontal"><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/php?promo_name=programs_list&promo_position=course&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">10 месяцев</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">С нуля</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">РНР-разработчик</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Изучите PHP и Laravel для разработки и проектирования REST API</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzk5MiwicHVyIjoiYmxvYl9pZCJ9fQ==--e9d0f30948ea766a7e6bc3e3d56c192344d45fb8/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Programming-cuate%20(1).png" alt="РНР-разработчик" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 5 650 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/php-laravel-developer?promo_name=programs_list&promo_position=course&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">1 месяц</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Для продвинутых</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Laravel</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Изучите фреймворк Laravel для создания веб-приложений</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzcyMSwicHVyIjoiYmxvYl9pZCJ9fQ==--b4d9b4d245e88f43c7f861ac11e675846937c317/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Programmer-bro.png" alt="Laravel" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 3 900 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/middle-php?promo_name=programs_list&promo_position=course&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">5 месяцев</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Для продвинутых</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Middle-php разработчик</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Освоите продвинутую работу с БД и серверной логикой</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NTIxNSwicHVyIjoiYmxvYl9pZCJ9fQ==--ee06f514098550b5ac7eebce6227b1543399a37c/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Hand%20coding-rafiki.png" alt="Middle-php разработчик" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 4 050 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses?promo_name=programs_list&promo_position=course&promo_creative=catalog_card&promo_type=card"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><h2 style="--title-fw:var(--mantine-h2-font-weight);--title-lh:var(--mantine-h2-line-height);--title-fz:var(--mantine-h2-font-size);margin-bottom:var(--mantine-spacing-md);font-size:var(--mantine-font-size-h3)" class="m_8a5d1357 mantine-Title-root" data-order="2" data-responsive="true">Каталог</h2><p style="margin-bottom:auto" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Полный список доступных курсов по разным направлениям</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="/vite/assets/development-BVihs_d5.png" alt="Orientation"/></div></div></div></a></div></div></div></div></div></div></div></div></div><style data-mantine-styles="inline">.__m__-_R_1bdub_{--col-flex-grow:auto;--col-flex-basis:8.333333333333334%;--col-max-width:8.333333333333334%;}@media(min-width: 48em){.__m__-_R_1bdub_{--col-flex-grow:auto;--col-flex-basis:16.666666666666668%;--col-max-width:16.666666666666668%;}}</style><div style="min-width:0rem;height:100%;min-height:0rem" class="m_96bdd299 mantine-Grid-col __m__-_R_1bdub_"><div style="margin-inline:var(--mantine-spacing-xs)" class="mantine-visible-from-sm"><a style="--button-color:var(--mantine-color-white);margin-bottom:var(--mantine-spacing-lg);text-decoration:none" class="mantine-focus-auto m_849cf0da mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses/php-orm-eloquent/lessons/setup/finish_unit?unit=theory" data-disabled="true" data-block="true" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label"><span style="margin-inline-end:var(--mantine-spacing-xs)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Дальше</span>→</span></span></a><a style="padding-inline:0rem" class="mantine-focus-auto m_f0824112 mantine-NavLink-root m_87cf2631 mantine-UnstyledButton-root"><span class="m_690090b5 mantine-NavLink-section" data-position="left"><div style="--ti-size:var(--ti-size-sm);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-list-numbers "><path d="M11 6h9"></path><path d="M11 12h9"></path><path d="M12 18h8"></path><path d="M4 16a2 2 0 1 1 4 0c0 .591 -.5 1 -1 1.5l-3 2.5h4"></path><path d="M6 10v-6l-2 2"></path></svg></div></span><div class="m_f07af9d2 mantine-NavLink-body"><span class="m_1f6ac4c4 mantine-NavLink-label">Навигация по теме</span><span class="m_57492dcc mantine-NavLink-description">Теория</span></div><span class="m_690090b5 mantine-NavLink-section" data-position="right"></span></a><div style="margin-block:var(--mantine-spacing-lg)" class="m_3eebeb36 mantine-Divider-root" data-orientation="horizontal" role="separator"></div><div style="margin-block:var(--mantine-spacing-lg)" class=""><div style="justify-content:space-between;margin-bottom:calc(0.1875rem * var(--mantine-scale));color:var(--mantine-color-dimmed);font-size:var(--mantine-font-size-xs)" class="m_8bffd616 mantine-Flex-root __m__-_R_qimrbdub_"><p style="font-size:var(--mantine-font-size-xs)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Завершено</p><p style="font-size:var(--mantine-font-size-xs)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">0 / 10</p></div><div style="--progress-size:var(--progress-size-sm)" class="m_db6d6462 mantine-Progress-root" data-size="sm"><div style="--progress-section-size:0%;--progress-section-color:var(--mantine-color-gray-filled)" class="m_2242eb65 mantine-Progress-section" role="progressbar" aria-valuemax="100" aria-valuemin="0" aria-valuenow="0" aria-valuetext="0%"></div></div></div><button style="padding-inline:0rem" class="mantine-focus-auto m_f0824112 mantine-NavLink-root m_87cf2631 mantine-UnstyledButton-root" type="button"><span class="m_690090b5 mantine-NavLink-section" data-position="left"><div style="--ti-size:var(--ti-size-sm);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-message "><path d="M8 9h8"></path><path d="M8 13h6"></path><path d="M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12"></path></svg></div></span><div class="m_f07af9d2 mantine-NavLink-body"><span class="m_1f6ac4c4 mantine-NavLink-label">Обсуждения (архив)</span><span class="m_57492dcc mantine-NavLink-description"></span></div></button><div style="--toc-bg:var(--mantine-color-blue-light);--toc-color:var(--mantine-color-blue-light-color);--toc-size:var(--mantine-font-size-sm);--toc-radius:var(--mantine-radius-sm);margin-top:var(--mantine-spacing-xl)" class="m_bcaa9990 mantine-TableOfContents-root" data-variant="light" data-size="sm"></div></div><div class="mantine-hidden-from-sm"><div style="--stack-gap:0rem;--stack-align:stretch;--stack-justify:flex-start" class="m_6d731127 mantine-Stack-root"><a style="--button-color:var(--mantine-color-white);margin-bottom:var(--mantine-spacing-xs);padding:0rem;text-decoration:none" class="mantine-focus-auto m_849cf0da mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses/php-orm-eloquent/lessons/setup/finish_unit?unit=theory" data-disabled="true" data-block="true" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">→</span></span></a><button style="--ai-size:var(--ai-size-sm);--ai-bg:transparent;--ai-hover:var(--mantine-color-indigo-light-hover);--ai-color:var(--mantine-color-indigo-light-color);--ai-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;padding-block:var(--mantine-spacing-lg);color:inherit;width:100%" class="mantine-focus-auto m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="subtle" data-size="sm" data-disabled="true" type="button" disabled=""><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-list-numbers "><path d="M11 6h9"></path><path d="M11 12h9"></path><path d="M12 18h8"></path><path d="M4 16a2 2 0 1 1 4 0c0 .591 -.5 1 -1 1.5l-3 2.5h4"></path><path d="M6 10v-6l-2 2"></path></svg></span></button><button style="--ai-size:var(--ai-size-sm);--ai-bg:transparent;--ai-hover:var(--mantine-color-indigo-light-hover);--ai-color:var(--mantine-color-indigo-light-color);--ai-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;padding-block:var(--mantine-spacing-lg);color:inherit;width:100%" class="mantine-focus-auto mantine-active m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="subtle" data-size="sm" type="button"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-message "><path d="M8 9h8"></path><path d="M8 13h6"></path><path d="M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12"></path></svg></span></button></div></div></div></div></div></div></div>
</main>
<footer class="bg-dark fw-light text-light px-3 py-5">
<div class="row small">
<div class="col-12 col-sm-6 col-md-3">
<div class="h5 mb-3">Хекслет</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/about">О нас</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/testimonials">Отзывы</a>
</li>
<li>
<span class="nav-link link-light py-1 ps-0 external-link" data-href="https://b2b.hexlet.io" role="button">Корпоративное обучение</span>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/blog">Блог</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/qna">Вопросы и ответы</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/glossary">Глоссарий</a>
</li>
<li>
<span class="nav-link link-light py-1 ps-0 external-link" data-href="https://help.hexlet.io" data-target="_blank" role="button">Справка</span>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" target="_blank" rel="noopener noreferrer" href="/map">Карта сайта</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5 fw-normal mb-3">Направления</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_devops">DevOps
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_data_analytics">Аналитика
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_backend_development">Бэкенд
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_programming">Программирование
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_testing">Тестирование
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_front_end_dev">Фронтенд
</a></li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5">Профессии</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/devops-engineer-from-scratch">DevOps-инженер с нуля</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/go">Go-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/java">Java-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/python">Python-разработчик </a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/data-analytics">Аналитик данных</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/qa-engineer">Инженер по ручному тестированию</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/php">РНР-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/frontend">Фронтенд-разработчик</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5">Навыки</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/python-django-developer">Django</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/docker">Docker</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/php-laravel-developer">Laravel</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/postman">Postman</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/js-react-developer">React</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/js-rest-api">REST API в Node.js</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/spring-boot">Spring Boot</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/typescript">Typescript</a>
</li>
</ul>
</div>
</div>
<hr>
<div class="row">
<div class="col-12 col-sm-4 col-md-2">
<div class="fs-4">
<ul class="list-unstyled d-flex">
<li class="me-3">
<a aria-label="Telegram" target="_blank" class="link-light" rel="noopener noreferrer nofollow" href="https://t.me/hexlet_ru"><span class="bi bi-telegram"></span>
</a></li>
<li>
<a aria-label="Youtube" target="_blank" class="link-light" rel="noopener noreferrer nofollow" href="https://www.youtube.com/user/HexletUniversity"><span class="bi bi-youtube"></span>
</a></li>
</ul>
</div>
<div class="mb-2 d-flex flex-column">
<a class="link-light text-decoration-none" rel="nofollow" href="mailto:support@hexlet.io">support@hexlet.io</a>
<a class="link-light text-decoration-none py-2" target="_blank" href="https://t.me/hexlet_help_bot">t.me/hexlet_help_bot</a>
</div>
<ul class="list-unstyled d-flex">
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 external-link" rel="nofollow" data-href="https://hexlet.io/locale/switch?new_locale=en" data-target="_self" role="button"><span class="my-auto">EN</span>
</span></li>
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 opacity-100 external-link" rel="nofollow" data-href="https://ru.hexlet.io/locale/switch?new_locale=ru" data-target="_self" role="button"><span class="my-auto">RU</span>
</span></li>
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 external-link" rel="nofollow" data-href="https://kz.hexlet.io/locale/switch?new_locale=kz" data-target="_self" role="button"><span class="my-auto">KZ</span>
</span></li>
</ul>
</div>
<div class="col-12 col-sm-4 col-md-3">
<ul class="list-unstyled fs-4">
<li class="mb-3">
<a class="link-light text-decoration-none" href="tel:8%20800%20100%2022%2047">8 800 100 22 47</a>
<span class="d-block opacity-50 small">бесплатно по РФ</span>
</li>
<li>
<a class="link-light text-decoration-none" href="tel:%2B7%20495%20085%2021%2062">+7 495 085 21 62</a>
<span class="d-block opacity-50 small">бесплатно по Москве</span>
</li>
</ul>
</div>
<div class="col-12 col-sm-4 col-md-3">
<div class="small mb-3">Образовательные услуги оказываются на основании Л035-01298-77/01989008 от 14.03.2025</div>
<ul class="list-unstyled small">
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/legal">Правовая информация</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/offer">Оферта</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/license">Лицензия</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/contacts">Контакты</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-12 col-md-4 small">
<div class="mb-2">
<div>ООО «<a href="/" class="text-decoration-none link-light">Хекслет Рус</a>»</div>
<div>108813 г. Москва, вн.тер.г. поселение Московский,</div>
<div>г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3</div>
<div>ОГРН 1217300010476</div>
<div>ИНН 7325174845</div>
</div>
<hr>
<div>АНО ДПО «<a href="/" class="text-decoration-none link-light">Учебный центр «Хекслет</a>»</div>
<div>119331 г. Москва, вн. тер. г. муниципальный округ</div>
<div>Ломоносовский, пр-кт Вернадского, д. 29</div>
<div>ОГРН 1247700712390</div>
<div>ИНН 7736364948</div>
</div>
</div>
</footer>
<div id="root-assistant-offcanvas"></div>
<script src="/vite/assets/assistant-Bukl1lYy.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/init-BrRXra1y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ErrorFallbackBlock-naDSYSy9.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/MarkdownBlock-DbyKWoR_.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/gon-D3e4yh1x.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/mantine-CGMYrt2Y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/shiki-V011pkdv.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/utils-DRqSHbQE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/lib-XR8Qr8kR.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dist-GCHh59xr.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Box-B5-OOzBf.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/notifications.store-C-3AFSMn.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useIsomorphicEffect-HJ6VK0D3.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/lib-KSp6QbZ0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/axios-BEvgo0ym.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/classnames-l6ipYlLR.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dayjs.min-BkKovM-s.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/debounce-jMQ_Cf4f.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/i18next-BlSq9s7B.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/client-U9M77rxp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-dom-DaLxUz_h.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useTranslation-Bx1Cdrkz.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/compiler-runtime-6XxiPFnt.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/jsx-runtime-CwjcCKJi.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-CkL4ZRHB.js" as="script" crossorigin="anonymous">
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v67327c56f0bb4ef8b305cae61679db8f1769101564043" integrity="sha512-rdcWY47ByXd76cbCFzznIcEaCN71jqkWBBqlwhF1SY7KubdLKZiEGeP7AyieKZlGP9hbY/MhGrwXzJC/HulNyg==" data-cf-beacon='{"version":"2024.11.0","token":"d11015b65d11429ea6b4a2ef37dd7e0b","server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
</body>
</html>