// Вариант 1
$user->setCounter(clone $user->getCounter());
$user->raiseCount();
// User.php
public function raiseCount(): void
{
$this->counter = $this->counter->add();
}
// Counter.php
public function add(): self
{
$self = clone $this;
++$self->value;
return $self;
}
а? Если нет и нужно все равно писать абсолютно всю логику в обьекте модели, то тогда он станет просто god обьектом на 100500 строчек
final class HandleCheckOutShoppingCart
{
public function __construct(Carts $carts, PaymentGateway $gateway)
{
$this->carts = $carts;
$this->gateway = $gateway;
}
public function __invoke(CheckOutShoppingCart $command) : void
{
$shoppingCart = $this->carts->get($command->shoppingCart());
$payment = $this->gateway->captureCharge($command->charge());
$shoppingCart->checkOut($payment);
}
}
Как такое может быть?
$em->clear()
Sometimes you want to clear the identity map of an EntityManager to start over. We use this regularly in our unit-tests to enforce loading objects from the database again instead of serving them from the identity map. You can call EntityManager#clear() to achieve this result.
https://www.doctrine-project.org/projects/doctrine...
Консьюмеру не хватате параметра какого - то?
resetManager()
— вы убиваете и этот SQL Logger с его объектами в памяти$this->em->getConnection()->getConfiguration()->setSQLLogger(null);
/**
* @OneToMany(targetEntity="Article", mappedBy="topic", cascade={"persist", "remove"})
*/
private $articles;
ObjectNormalizer
или GetSetMethodNormalizer
, раз решили через сеттеры/геттеры с сущностями работать$obj = $this->normalizer->denormalize($data, YourEntity::class);
flush()
нужно вынести, потому что вы можете заперсистить 100 объектов и сделать один flush — одна череда обращений к Бд. В вашем же случае будет 100 и более обращений к БДis_a()
и вот это все) и если придет не тот объект — кидать InvalidArgumentException
values
, потом при сборке запроса Doctrine достает первый найденный Parameter с ключом values
(а их таких несколько, но ей достаточно первого). values
[$normalizedKey, $key] = $this->getKeys($qb);
$qb
->andWhere(sprintf('%s IN (:%s)', $normalizedKey, $key))
->setParameter($key, $this->getValue());
то как быть с ситуацией, когда в некоторых модулях должны производиться сложные выборки с фильтрами, агрегацией, затрагивающие сущности (entity) других модулей?
SELECT product.*, last_prices.*
FROM product
LEFT JOIN (
SELECT product_id AS id, max(id) as price_id
FROM price
GROUP BY product_id
) last_prices ON last_prices.id=product.id
[error] Migration DoctrineMigrations\Version20200628093518 failed during...
ON CONFLICT (expression) DO NOTHING
и похожие решения в других СУБД могут быть иногда довольно подходящими в виду простоты реализации...$sql = <<<SQL
INSERT INTO table (id, value)
VALUES (555, \'uniqValue\')
ON CONFLICT (value) DO NOTHING
SQL;
$this->em->getConnection()->executeQuery($sql);