Александр II
Юра
Поароубйн просто и там и там сделай d:m:diff
Юра
Сгенерит мигоации
Юра
Но вообще как-то криво
Александр II
Maks
?
по идеи у тебя в бандле должна лежать модель, а в совем проекте ты ее наследуешь как ентити
Alexey Mishurovskiy
Alexey Mishurovskiy
Но опасно, можно логику поломать
Andrey
здрасьте, вопрос от СЗЗБ по доктрине
старый проект, есть ентити, где много чего понавешано
допустим, кастомер, у которого может быть скидка на отдельные товары:
class Customer {
/**
* @ORM\OneToMany(targetEntity="\ProductDiscount", mappedBy="customer", cascade={"persist"}, orphanRemoval=true)
*/
private $productDiscounts;
public function getProductDiscount(Product $product) {
$criteria = ...
$discount = $this->productDiscounts->matching($criteria)->first();
return $discount->percent();
}
}
для отдельных товаров работает, но если запрашивать скидку для группы товаров, то из-за matching не вся коллекция запрашивается, а только часть
т.е. для n товаров будет N запросов, естесно все тормозит
можно легко пофиксить добавив $this->discounts вначале, но об этом легко забыть, да и мест таких дофига (не только товары, но и сервисы и прочее), хотелось бы подчистить
придумал создать класс со скидками, где каждая скидка в отдельном классе, т.е.
class ProductDiscounts {
/**
* @ORM\OneToMany(targetEntity="ProductDiscount", mappedBy="discounts", cascade={"persist"}, orphanRemoval=true)
*/
private $productDiscounts;
public function getDiscount(Product $product) {
$criteria = ...
$discount = $this->productDiscounts->matching($criteria)->first();
return $discount->percent();
}
}
class Discounts {
/**
* @ORM\OneToOne(targetEntity="ProductDiscounts")
* @ORM\JoinColumn(name="id", referencedColumnName="id")
*/
private $productDiscounts;
...
public function products() {
return $this->productDiscounts;
}
...
}
class Customer {
/**
* @ORM\OneToOne(targetEntity="ProductDiscounts")
* @ORM\JoinColumn(name="id", referencedColumnName="id")
*/
private $discounts;
public function getProductDiscount(Product $product) {
return $this->discounts->products->getDiscount(product)->percent();
}
}
для Discounts и ProductDiscounts мне отдельные таблички не нужны - достаточно существущей кастомера, т.е. те классы я замапил на существующую табичку
все работает, но со скидками можно работать только после того, как запросишь кастомера/скидки с базы:
$customer = $em->find(Customer::class, $customerId);
$customer->discounts()->products()->setDiscount($product, '12.3');
$em->flush();
// или
$discounts = $em->find(Discounts::class, $customerId);
$discounts->products()->setDiscount($product, '12.3');
$em->flush();
а вот если со скидками работать сразу после создания объекта - вылетает ошибка
т.е. следующее не работает:
$customer = new Customer();
$customer->discounts()->products()->setDiscount($product, '12.3');
$em->flush();
пробовал разное, и ошибки разные: нет персиста, или существующий id уже есть и т.д.
на данный момент таких мест с ошибкой нет, но они легко могут появиться
и как здесь быть, чтобы работало всегда, а не только после загрузки кастомера?
можно, конечно, для всего сделать отдельные таблички и там все автоматом будет персиститься/сохраняться, но там, по хорошему, будет только одно поле: customerId, не нравится мне такой оверхед, хотелось бы на одной все разрулить, но какие варианты для этого есть?
Alexey Mishurovskiy
Парни есть у кого верстак срочно баннер сверстать?
Andrey
One
мой верстак всегда при мне
Eshently
Иван
Alexey Mishurovskiy
Alexey Mishurovskiy
Кто-то пользуется\пользовался OVH Cloud?
Алексей Анатольевич
atcq (Алексей)
Alexey Mishurovskiy
atcq (Алексей)
И как впечатления ?
очень стабильно, но когда сгорел сервер вместе с дц - были отписки от техподдержки несколько месяцев подряд
atcq (Алексей)
можно рассматривать как дешевое стабильное решение без поддержки в принципе (те. проблемы остаются твоими личными)
Alexey Mishurovskiy
ну с поддержкой у них туго, да.
Alexey Mishurovskiy
я просто некоторые вещи не понимаю. я логинюсь на ca.ovh.com при этом попытка залогиниться в любой другой стране, приводит к требованию заполнения анкеты, но страна резинетства почему-то хардкод UK
atcq (Алексей)
Alexey Mishurovskiy
мне надо корпоративное облако построить, вот думаю где взять датацентр с полноценной поддержкой VLAN
One
привет. я хочу продавать.
One
подскажите, что я должен поставить
One
и куда ставить
One
я когда то увлекался html
это какойто крутой язык программирования как мне сказали
One
этого хватит?
Юра
Vlad
One
а я могу использовать и php в добавок к HTML ?
One
они дружат?
Andrei
жирно
One
жирно
да жирно. но можно вроде подлкючить opcache - я где то читал про это
Andrei
жирно троллите товарищ
Юра
Используй опенкарт и продавай себе
One
😀
Юра
Хочу продавать помидоры, огурцы там соленые. Подскажите подойдёт пхп для этого иди надо джумлу юзать?
Сергей
cucumber заюзай
Юра
))) он дружит с помидорами?
One
ого... оказывается есть twig
и там можно писать html
круто... охренеть
Юра
Ты можешь открыть пустую вкладку в хроме и через дев консоль написать хтмл
Юра
Только не забудь сохранить )
One
Dmitry
Страницы можно делать в Ворде и сохранять в HTML
Юра
Конечно. Вебпак же на джс написан
Юра
https://youtu.be/X34ZmkeZDos
One
Мйкрософт круто, но у меня нет денег на лицензионный ключ, поэтому у меня Linux
Иван
Юра
Безвыходная ситуация. Забей
Юра
Можно разместить на яндекс маркете, с фото и анализами
One
Andrey
а если без шуток - посоветуйте какой sass или магазин на php
Andrey
здрасьте, вопрос от СЗЗБ по доктрине
старый проект, есть ентити, где много чего понавешано
допустим, кастомер, у которого может быть скидка на отдельные товары:
class Customer {
/**
* @ORM\OneToMany(targetEntity="\ProductDiscount", mappedBy="customer", cascade={"persist"}, orphanRemoval=true)
*/
private $productDiscounts;
public function getProductDiscount(Product $product) {
$criteria = ...
$discount = $this->productDiscounts->matching($criteria)->first();
return $discount->percent();
}
}
для отдельных товаров работает, но если запрашивать скидку для группы товаров, то из-за matching не вся коллекция запрашивается, а только часть
т.е. для n товаров будет N запросов, естесно все тормозит
можно легко пофиксить добавив $this->discounts вначале, но об этом легко забыть, да и мест таких дофига (не только товары, но и сервисы и прочее), хотелось бы подчистить
придумал создать класс со скидками, где каждая скидка в отдельном классе, т.е.
class ProductDiscounts {
/**
* @ORM\OneToMany(targetEntity="ProductDiscount", mappedBy="discounts", cascade={"persist"}, orphanRemoval=true)
*/
private $productDiscounts;
public function getDiscount(Product $product) {
$criteria = ...
$discount = $this->productDiscounts->matching($criteria)->first();
return $discount->percent();
}
}
class Discounts {
/**
* @ORM\OneToOne(targetEntity="ProductDiscounts")
* @ORM\JoinColumn(name="id", referencedColumnName="id")
*/
private $productDiscounts;
...
public function products() {
return $this->productDiscounts;
}
...
}
class Customer {
/**
* @ORM\OneToOne(targetEntity="ProductDiscounts")
* @ORM\JoinColumn(name="id", referencedColumnName="id")
*/
private $discounts;
public function getProductDiscount(Product $product) {
return $this->discounts->products->getDiscount(product)->percent();
}
}
для Discounts и ProductDiscounts мне отдельные таблички не нужны - достаточно существущей кастомера, т.е. те классы я замапил на существующую табичку
все работает, но со скидками можно работать только после того, как запросишь кастомера/скидки с базы:
$customer = $em->find(Customer::class, $customerId);
$customer->discounts()->products()->setDiscount($product, '12.3');
$em->flush();
// или
$discounts = $em->find(Discounts::class, $customerId);
$discounts->products()->setDiscount($product, '12.3');
$em->flush();
а вот если со скидками работать сразу после создания объекта - вылетает ошибка
т.е. следующее не работает:
$customer = new Customer();
$customer->discounts()->products()->setDiscount($product, '12.3');
$em->flush();
пробовал разное, и ошибки разные: нет персиста, или существующий id уже есть и т.д.
на данный момент таких мест с ошибкой нет, но они легко могут появиться
и как здесь быть, чтобы работало всегда, а не только после загрузки кастомера?
можно, конечно, для всего сделать отдельные таблички и там все автоматом будет персиститься/сохраняться, но там, по хорошему, будет только одно поле: customerId, не нравится мне такой оверхед, хотелось бы на одной все разрулить, но какие варианты для этого есть?
Мож по доктрине кто канал посоветует? Должно же быть решение при таких входных
В кукбуках доктрины есть похожее для декоратора, но там с какого-то фига декорируемый класс в базе хранится как новая сущность, а мне бы типа того же декоратора для существующей заюзать надо
Юра
Andrey
А если приджоинить чтобы не было эн запоосов?
не всегда знаешь надо это будет или нет, а без знания все равно что fetch=eager добавить
где потребуется - сильно ускоряет работу, а вот где не требуется - там замедляет
+ таких свйоств несколько и не все нужны одновременно
+ в entity пихали все подряд, что имеет к ней отношение, хотелось бы вынести эти части в отдельные объекты
вангую, что после всех изменений мне эти связи в исходной entity не потребуются, но пока промежуточный шаг - оно нужно и хотелось бы, чтобы работало всегда, а не только при правильном использовании
Юра
Ну так джоины будут только там где ты скажешь приджоинить
Юра
Обычно тяжёлые запросы всеравно через билдер идут
Andrey
ну это да, можно найти все места и заменить всякие $repo->getList(), на $repo->getListWithDiscounts(), но хотелось бы и из класса лишнее убрать,
иногда до 1К строчек свойств бывает (с комментами, правда, но все же)
когда тормоза стал смотреть - и захотелось сразу разделить все, а там и тормоза пропали бы
вот через отдельную таблицу вижу как сделать, но там, грубо, 1 поле будет: customerId (ну или два, если и id еще считать) и смысл ее добавлять?
ну и добавлять придется штук 5 таких табличек, если не больше
а как на существующую забиндить - хз
в кукбуках есть описание для декоратора (https://www.doctrine-project.org/projects/doctrine-orm/en/current/cookbook/decorator-pattern.html#persisting-the-decorator-pattern), но там декоратор какой-то корявый: не существующие объекты декорирует, а новый объект создает, и получается у нас тупое single table inheritence
ну и говорю: если селект, то и проблемы-то сейчас нет, все уже работает
а вот если создавать с нуля (например, в тесте где-нить), то беда будет,
т.е. сейчас ошибка в коде
$customer = new Customer();
$customer->discounts()->products()->setDiscount($product, '12.3');
$em->flush();
но я существующее итерациями переделываю, т.е. работает по старому на новый лад, чтобы потом проще изменения было делать,
возможно, стоит старую работу сразу немного изменить и вместо
$customer->discounts()->...
делать напрямую
$product->setDiscount($customer, '12.3')
или
$product->getDiscount($customer)
тогда мне и классы замапенные на существующую табличку вроде вовсе не нужны будут, хотя и не уверен, сильно еще не вникал в эту идею
но уже чисто из любопытства интересно как исходную задачу сделать? говорю же: вопрос от ССЗБ
Dima
Денис
Лучше
Никакого другого ответа и не ожидал
Dima
Никакого другого ответа и не ожидал
А тебе это и не нужно. Я тоже тяжко заходил в питон, с его форматированием и прочим. Но теперь все вею проекты на сиифони плюс вью, а апишки/боты/парсеры/мелкая херня на питоне
Денис
Dima
Речь изначально о чем шла? Ты даже не можешь сформулировать, в чем преимущество, но пишешь "пэхопэ говно пиши на питоне". Это, мне кажется, какая-то зараза в самом языке. Сколько бы не видел хейта на пхп, 9 из 10, что это будет любитель питона. Ни со стороны явы, ни с шарпа ни разу такого не слышал
Не надо грязи, я сказал что боты для TG будут легче-удобнее на питоне. Все остальное твои фантазии. Я писал боты на пхп, все по феншую, затем написал 1 на пиооне и все переписал на питоне затем.
Dima
Я пистолет к голове не приставляю, высказал свое мнение и только.
Katulos
Katulos
Dima
Как и любое МНЕНИЕ - субьективное
Andrey
Юра
У питона какая-то боль с совместимостью версий и библотек. Или я не умею его готовить но бесит когда ты что-то ставишь а оно падает с невнятным сообщением что чего-то там нет, а потом оказывается что в пределах минорных версий поломали совместимость