ManyToMany
, на ManyToOne
и OneToMany
, вам нужно вручную выделить сущность FileTarget
и вручную там расписать связи. Соответственно в сущности FileTarget
/**
* @ORM\Entity
* @ORM\Table(name="file_target")
*/
class FileTarget
{
//другие свойства.
/**
* @ManyToOne(targetEntity="File" , inversedBy="fileTarget")
* @JoinColumn(name="file_id", referencedColumnName="id")
*/
private File|null $file= null;
}
File
создайте коллекцию OneToMany
https://www.doctrine-project.org/projects/doctrine...ManyToOne
в сущности File
, но уже на User
, а в самом User
уже коллекцию OneToMany
на File
.User
вы сможете получить коллекцию на ваши file.class User
{
//другие свойства и функции.
/** @return File[] */
public function getFiles(): array {
return $this->files->toArray();
}
}
foreach
достаём нужные объекты из getFiles()
и обращаемся по свойствам объекта куда нужно.User
, по коду это получается класс File
public function getUserWithTargetType(int $targetType): User {
//через foreach перебираете User и по условию $targetType возвращаете User
}
Specifies which strategy is used for identifier generation for an instance variable which is annotated by @Id. This annotation is optional and only has meaning when used in conjunction with @Id.
doctrine:mapping:import
(эта функция кстати депрекейтет и скоро удалят, если никто не вызовется поддерживать) и сверяю с тем, что написано у меня, т.к Доктрина очень капризна, у вас может быть всё правильно написано, но не в том порядке или не в том месте.$this->addSql();
$this->addSql('COMMENT ON COLUMN table.field IS \'(DC2Type:datetime_immutable)\'');
php bin/console doctrine:mapping:import "App\EntityFromDB" annotation --path=src/EntityFromDB
createQueryBuilder
leftJoin
c Join::WITH
public function getAllProductsWithCategories(): array
{
/** @var Product[] $entities */
$entities = $this->repo->createQueryBuilder('t')
->select('t')
->leftJoin(Category::class, 't2', Join::WITH,'t.id = t2.product') //здесь джойним по полям, которые объявлены в наших сущностях (пункт 1)
->getQuery()
->getArrayResult();
if (count($entities) === 0) {
throw new EntityNotFoundException('No product.');
}
return $entities;
}
class BigIntType extends Type
{
public function convertToPHPValue($value, AbstractPlatform $platform): ?int
{
return $value === null ? null : (int) $value; //до того как данные попали в сущность, мы насильно конвертируем в int (иначе будет строка)
}
public function getSQLDeclaration(array $column, AbstractPlatform $platform): string
{
return $platform->getBigIntTypeDeclarationSQL($column);
}
public function getName(): string
{
return Types::BIGINT;
}
}
options={"default"="now()"}
/**
* @ORM\Column(name="date", type="datetime_immutable", nullable=false, options={"default"="now()"})
*/
private \DateTimeImmutable $date;
CollectionType
формы в html атрибут data-prototype<div data-prototype="
{% apply escape %}
{{ include('app/template/prototype/collection_form.html.twig', { 'form': form.attributes.vars.prototype }) }}
{% endapply %}"></div>
collection_form.html.twig
что-то такое:{{ form_widget(form.name) }}
{{ form_widget(form.product) }}
{{ form_widget(form.attribute) }}
data-prototype
, когда пользователь нажмёт кнопку добавить новый атрибут. При вставке вам нужно будет вручную выставлять индексы новым полям, по дефолту symfony засунет туда что-то вида form[__name__]
attributes[]
attributes[]
, то просто через foreach
создаёте форму.{% for row in form.attributes %}
{{ form_widget(row.name) }}
{{ form_widget(row.attribute) }}
{% endfor %}
class Inventory {
/**
* @ORM\ManyToOne(targetEntity=Price::class, inversedBy="prices")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="id_price", referencedColumnName="id")
* })
*/
protected $prices;
}