@symnoob

Symfony 4 — Doctrine Может кто помочь с SQL DQL?

Всем Привет,

помогите пожалуйста с sql/dql, есть две таблицы / энтити.

Мне нужно достать все данные из artikel.art_text, при условии что art.id =3

если связи с "artikel.art" нет, то в полях которые пришли из "artikel.art" должны стоять null, но приэтом должны выводиться все поля из artikel.art_text.

надеюсь что понятно что я хочу сделать...

на данный момент выводится только одна страка с данными:
SELECT * FROM artikel.art_text txt
LEFT JOIN artikel.art art ON txt.art_id = art.id

WHERE art.id =3
  • Вопрос задан
  • 139 просмотров
Решения вопроса 1
1) Маппинг Доктрины - для больших проектов плохая вещь, ибо работает не всегда правильно. Поэтому лучше работать с композитными ключами.

2) @ORM\GeneratedValue() - вот это тоже не лучшая практика, потом замучаешься шардировать проект и менять схему таблицы. Обычно проекты на Symfony - это не бложики (но это так на будущее)

3) В общем, все выглядит примерно так:

В репозитории родительского класса пишем метод, который выглядит как-то так. Там же пишем Joint к тому классу, что тебе нужно - делаем маппинг и через where / andWhere добавляем нужные тебе условия выборки. Это пример на innerJoin, на leftJoin будет выглядеть также, просто метод другой.

public function GetUsers(int $offset = 0, int $limit = 1000): array
    {
        $users = $this->createQueryBuilder('a')
            ->select('a.email')
            ->join(Secret::class, 's', Join::WITH, 'a.site = s.siteId')
            ->where('s.active = :active')
            ->setParameter('active', 1)
            ->setFirstResult($offset)
            ->setMaxResults($limit)
            ->getQuery()
            ->getScalarResult();

        return $users;
    }
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@symnoob Автор вопроса
<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\ArtikerTextRepository")
 */
class ArtikerText
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $titel;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Artikel")
     */
    private $artikel;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getTitel(): ?string
    {
        return $this->titel;
    }

    public function setTitel(string $titel): self
    {
        $this->titel = $titel;

        return $this;
    }

    public function getArtikel(): ?Artikel
    {
        return $this->artikel;
    }

    public function setArtikel(?Artikel $artikel): self
    {
        $this->artikel = $artikel;

        return $this;
    }
}


<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\ArtikelRepository")
 */
class Artikel
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $cat;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getCat(): ?string
    {
        return $this->cat;
    }

    public function setCat(string $cat): self
    {
        $this->cat = $cat;

        return $this;
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы