Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 361новая вакансия за сутки·93 707вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 266
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 402 кандидата открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 108
  • Облачные технологии14 073
  • QA вакансии3 460
  • Backend вакансии2 114
  • Инженер данных1 805
  • Продакт-менеджер1 266

Разработка

  • Android1 866
  • iOS1 699
  • Fullstack вакансии986
  • AI вакансии955
  • Frontend вакансии745
  • Mobile вакансии44

По стеку

  • Go8 652
  • Java6 545
  • Node.js2 019
  • .NET1 721
  • Kotlin1 623
  • Rust1 453
  • C#710
  • PHP683
  • C++571

DevOps и инфраструктура

  • Kubernetes7 763
  • DevOps вакансии6 060
  • Linux-инфраструктура5 492
  • Terraform / IaC4 261
  • CI/CD3 241
  • Мониторинг и Observability1 783
  • SRE566
  • Кибербезопасность453

Аналитика и данные

  • Data Scientist1 140
  • Бизнес-аналитик930
  • Аналитик данных853
  • Системный аналитик154

Другие направления

  • Проджект-менеджер615
  • UI/UX дизайн146
  • Ручное тестирование14

По регионам

  • Вакансии в США44 321
  • Вакансии в Европе23 862
  • Вакансии в Канаде4 479
  • Работа в России3 913

По формату

  • Удалённые вакансии75 064
  • Релокация в США44 314
  • Гибридная работа12 393
  • Офисная работа7 089

По уровню

  • Senior вакансии42 691
  • Middle вакансии20 905
  • Junior вакансии6 727

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab138 вакансий
  • Celonis39 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме SymfonyВсе вопросы
SymfonyMiddleТеория

В чём разница между persist() и flush() в Doctrine?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

persist() переводит новую сущность под наблюдение Doctrine (SQL не выполняется), а flush() применяет все накопленные изменения к базе данных одним батчем в транзакции; уже managed-объекты не требуют persist() — Doctrine трекает их изменения автоматически.

persist() — регистрация объекта

Метод EntityManager::persist($entity) переводит объект из состояния new (transient) в состояние managed. После этого Doctrine «следит» за изменениями объекта до момента flush. Никакого SQL не выполняется.

<?php
use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;

class UserService
{
    public function __construct(
        private readonly EntityManagerInterface $em,
    ) {}

    public function createUser(string $email, string $name): User
    {
        $user = new User();
        $user->setEmail($email);
        $user->setName($name);

        // SQL ещё не выполнен! Объект просто «под наблюдением»
        $this->em->persist($user);

        // Только здесь Doctrine генерирует INSERT INTO users ...
        $this->em->flush();

        // Теперь $user->getId() доступен
        return $user;
    }
}

Разница между persist() и flush() в Doctrine

Doctrine ORM реализует паттерн Unit of Work: все изменения накапливаются в памяти и отправляются в базу данных одним SQL-батчем при вызове flush().

flush() — запись в базу данных

flush() обходит все managed entities, вычисляет изменения (changeset) и выполняет необходимые INSERT/UPDATE/DELETE в одной транзакции. Для новых объектов — INSERT, для изменённых — UPDATE, для удалённых (remove()) — DELETE.

<?php
// flush() обрабатывает ВСЕ изменения, не только свежие persist
$user = $this->em->find(User::class, 1);
$user->setName('Alice'); // Изменение уже managed entity

$newUser = new User();
$newUser->setEmail('bob@example.com');
$this->em->persist($newUser);

// Один flush — один батч SQL:
// UPDATE users SET name = 'Alice' WHERE id = 1
// INSERT INTO users (email) VALUES ('bob@example.com')
$this->em->flush();

Жизненный цикл состояний объекта

new User()          --> TRANSIENT (Doctrine не знает об объекте)
  persist($user)    --> MANAGED (под наблюдением UnitOfWork)
  flush()           --> MANAGED (и ID проставлен из БД)
  remove($user)     --> REMOVED (будет DELETE при flush)
  flush()           --> DETACHED (объект исчез из UnitOfWork)
  detach($user)     --> DETACHED (ручное отсоединение)
  merge($user)      --> MANAGED (повторное присоединение, устарело в Doctrine 3)

Когда persist() не нужен

Если объект уже в состоянии MANAGED (получен через find(), getRepository()->findOne() или из коллекции с cascade), изменения автоматически трекаются без вызова persist:

<?php
$product = $this->em->find(Product::class, 42); // MANAGED
$product->setPrice(99.99); // автоматически трекается

// persist() здесь лишний (но не вреден)
$this->em->flush(); // UPDATE products SET price = 99.99 WHERE id = 42

Cascade persist

Связанные сущности автоматически persist'ятся, если в маппинге указан cascade: ['persist']:

<?php
use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
class Order
{
    #[ORM\OneToMany(
        targetEntity: OrderItem::class,
        mappedBy: 'order',
        cascade: ['persist', 'remove'],
        orphanRemoval: true,
    )]
    private Collection $items;

    public function addItem(OrderItem $item): void
    {
        $item->setOrder($this);
        $this->items->add($item);
        // persist($item) не нужен — cascade сделает это
    }
}

// Использование:
$order = new Order();
$order->addItem(new OrderItem('Widget', 10));
$this->em->persist($order);
$this->em->flush(); // INSERT order + INSERT order_item

Подводные камни

  • Вызов flush() без persist() для новой сущности не даёт ошибки — объект просто игнорируется Doctrine.
  • flush() оборачивает все операции в транзакцию; если один INSERT упал с constraint violation, откатываются все изменения текущего flush.
  • Частый flush() внутри цикла убивает производительность — лучше один flush после цикла или использовать batch-вставку через DBAL.
  • После clear() (очистка UnitOfWork) все ранее managed объекты становятся DETACHED — изменения в них не будут сохранены при следующем flush.
  • cascade: ['persist'] на ManyToMany-связях может каскадно персистить сотни объектов неожиданно для разработчика.
  • В тестах с EntityManager в памяти (без реальной БД) flush проходит без ошибок даже при нарушении уникальных индексов — проверяйте с реальной БД.

Частые вопросы на собеседовании

  • Как Symfony обрабатывает защиту от CSRF?
  • Как устроен Dependency Injection container compile pass?
  • Как работает service container (контейнер dependency injection) в Symfony?
  • В каких backend-проектах Symfony является сильным выбором, а где лучше выбрать более простой или другой стек?

Типичные ошибки

  • Сводить persist vs flush к названию метода без lifecycle и failure path.
  • Игнорировать модель runtime: Symfony 7/8 строит request lifecycle вокруг HttpKernel, events, routing, controller resolver и response listeners.
  • Не отделять validation, authorization, transaction boundary и business logic.
  • Менять похожие API местами без учёта семантики ошибок и ownership.

Что проверяет интервьюер

  • Объясняет persist vs flush через конкретную точку lifecycle в Symfony.
  • Приводит корректный минимальный пример без вымышленных методов или callbacks.
  • Называет edge cases: пустые значения, ошибки, транзакции, безопасность или concurrency.

Как вы знаете этот вопрос?

Проверить себя по теме Symfony →

Источники

  • https://www.doctrine-project.org/projects/doctrine-orm/en/current/reference/working-with-objects.html
  • https://symfony.com/doc/current/index.html
←Предыдущий вопросЧто такое компонент HttpClient в Symfony и как его использовать?Следующий вопрос→Как писать функциональные тесты в Symfony с помощью testing client?

Связанные темы

SymfonyBackend-Engineeringsymfony-ecosystem