Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 太多的抱怨_Php_Symfony_Doctrine Orm_Dql - Fatal编程技术网

Php 太多的抱怨

Php 太多的抱怨,php,symfony,doctrine-orm,dql,Php,Symfony,Doctrine Orm,Dql,我有多个实体,当我做一个findAll时,除了一个实体之外,我只有一个请求 /** * @ORM\Entity(repositoryClass="App\Repository\PropertyRepository") * @ORM\Table(name="property") */ class Property { /** * @ORM\Id() * @ORM\GeneratedValue() * @ORM\Column(type="integer") * @Assert\Type

我有多个实体,当我做一个findAll时,除了一个实体之外,我只有一个请求

/**
 * @ORM\Entity(repositoryClass="App\Repository\PropertyRepository")
 * @ORM\Table(name="property")
 */
class Property
{
/**
 * @ORM\Id()
 * @ORM\GeneratedValue()
 * @ORM\Column(type="integer")
 * @Assert\Type("integer")
 * @var int
 */
private $id;

/**
 * @ORM\Column(type="string", length=255)
 * @Assert\NotBlank
 * @Assert\Choice({"Appartement", "Maison", "Garage", "Bureau", "Château", "Commerce"})
 * @var string
 */
private $propertyCategory;

/**
 * @ORM\Column(type="string", length=255)
 * @Assert\NotBlank
 * @Assert\Type("string")
 * @var string
 */
private $uniqueName;

/**
 * @ORM\Column(type="string", length=255)
 * @Assert\NotBlank
 * @Assert\Type("string")
 * @var string
 */
private $address;

/**
 * @ORM\Column(type="string", length=255)
 * @Assert\NotBlank
 * @Assert\Type("string")
 * @var string
 */
private $city;

/**
 * @ORM\Column(type="integer")
 * @Assert\NotBlank
 * @Assert\Type("integer")
 * @Assert\Length(min = 5, minMessage = "Ce champ doit contenir 5 chiffres")
 * @Assert\Length(max = 5, maxMessage = "Ce champ doit contenir 5 chiffres")
 * @var int
 */
private $zipCode;

/**
 * @ORM\Column(type="string", length=255)
 * @Assert\NotBlank
 * @Assert\Country
 * @var string
 */
private $country;

/**
 * @ORM\Column(type="integer")
 * @Assert\NotBlank
 * @Assert\Type("integer")
 * @var string
 */
private $surfaceInSquareMeter;

/**
 * @ORM\Column(type="integer")
 * @Assert\NotBlank
 * @Assert\Type("integer")
 * @var int
 */
private $numberOfPiece;

/**
 * @ORM\Column(type="text", nullable=true)
 * @Assert\Type("string")
 * @var string
 */
private $description;

/**
 * @ORM\Column(type="string", length=255)
 * @Assert\NotBlank
 * @Assert\Choice({"Meublé", "Non meublé"})
 * @var string
 */
private $rentalCategory;

/**
 * @ORM\Column(type="float")
 * @Assert\NotBlank
 * @Assert\Type("float")
 * @var float
 */
private $rentExcludingCharges;

/**
 * @ORM\Column(type="float")
 * @Assert\NotBlank
 * @Assert\Type("float")
 * @var float
 */
private $charges;

/**
 * @ORM\Column(type="float")
 * @Assert\NotBlank
 * @Assert\Type("float")
 * @var float
 */
private $purchasePrice;

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="properties")
 * @JoinColumn(name="user_property_id", referencedColumnName="id", onDelete="CASCADE")
 */
private $userProperty;

/**
 * @ORM\ManyToMany(targetEntity="App\Entity\Equipment", mappedBy="equipment")
 */
private $equipment;

/**
 * @ORM\ManyToMany(targetEntity="App\Entity\Lessee", mappedBy="lessee")
 */
private $lessees;

/**
 * @ORM\Column(type="string", length=255, nullable=true)
 * @Assert\File(
 *     maxSize = "2000k",
 *     mimeTypes = {"application/pdf", "application/x-pdf"},
 *     mimeTypesMessage = "Choisisez un fichier PDF"
 * )
 */
private $pdfFile;
我没有向您展示getter/setter,因为它超过500行,但我生成了它们

条令是对每个属性进行一次查询。为了解决我的问题,我尝试这样做:

/**
 * @param User $user
 * @return array
 */
public function findPropertyByUser(User $user): array
{
    $qb = $this->createQueryBuilder('p')
        ->andWhere('p.userProperty = :user')
        ->setParameter('user', $user)
        ->orderBy('p.id', 'ASC')
        ->getQuery();
    return $qb->execute();
}
但它没有改变任何事情,我也尝试使用findBy,但它没有改变任何事情。谁能告诉我我的问题出在哪里

编辑: 根据评论,这可能是n+1的问题

我尝试了不同的方法,但没有找到解决方案,以下是我的实际方法:

/**
 * @param User $user
 * @return array
 */
public function findPropertyByUser(User $user): array
{
    $qb = $this->createQueryBuilder('p')
        ->andWhere('p.userProperty = :user')
        ->setParameter('user', $user)
        ->orderBy('p.id', 'ASC')
        ->innerJoin('p.userProperty', 'u')
        ->addSelect('u')
        ->getQuery();
    return $qb->execute();
}
最后在我看来,请求正在提交

{% if properties is defined %}
            {% for property in properties %}

                    {% set emails = [property.userProperty.email] %}
                    {% for lessee in property.lessees.values %}
                        {% set emails = emails|merge([lessee.email]) %}
                    {% endfor %}

                    {% if app.user.email in emails %}
                        <tr>
                            <td>{{ property.propertyCategory }}</td>
                            <td>{{ property.uniqueName }}</td>
                            <td>{{ property.address }}</td>
                            <td>{{ property.city }}</td>
                            <td>{{ property.zipCode }}</td>
                            <td>{{ property.rentExcludingCharges }} €</td>
                            <td>{{ property.charges }} €</td>
                            <td>{{ property.purchasePrice }} €</td>
                            <td>
                                <a href="{{ path('property_show', {'id': property.id}) }}">Voir</a>
                                {% if is_granted('ROLE_USER') %}
                                    <a href="{{ path('property_edit', {'id': property.id}) }}"><i class="fas fa-edit"></i> édition</a>
                                {% endif %}
                            </td>
                        </tr>
                    {% endif %}
            {% endfor %}
        {% else %}
            <tr>
                <td colspan="16">Vous n'avez pas enregistré de propriétés</td>
            </tr>
        {% endif %}

您需要一个leftJoin,如:

/**
 * @param User $user
 * @return array
 */
public function findPropertyByUser(User $user): array
{
    $qb = $this->createQueryBuilder('p')
        ->leftJoin('p.lessees', 'l')
        ->andWhere('p.userProperty = :user OR l.email = :userEmail')
        ->setParameter('user', $user)
        ->setParameter('userEmail', $user->getEmail())
        ->orderBy('p.id', 'ASC')
        ->getQuery();

    return $qb->execute();
}
并在视图中删除有关电子邮件的所有内容:

{% if properties is defined %}
            {% for property in properties %}
                <tr>
                    <td>{{ property.propertyCategory }}</td>
                    <td>{{ property.uniqueName }}</td>
                    <td>{{ property.address }}</td>
                    <td>{{ property.city }}</td>
                    <td>{{ property.zipCode }}</td>
                    <td>{{ property.rentExcludingCharges }} €</td>
                    <td>{{ property.charges }} €</td>
                    <td>{{ property.purchasePrice }} €</td>
                    <td>
                        <a href="{{ path('property_show', {'id': property.id}) }}">Voir</a>

                        {% if is_granted('ROLE_USER') %}
                            <a href="{{ path('property_edit', {'id': property.id}) }}"><i class="fas fa-edit"></i> édition</a>
                        {% endif %}
                    </td>
                </tr>
            {% endfor %}
        {% else %}
            <tr>
                <td colspan="16">Vous n'avez pas enregistré de propriétés</td>
            </tr>
        {% endif %}
{%如果定义了属性%}
{properties%%中的属性为%s}
{{property.propertyCategory}
{{property.uniqueName}
{{property.address}
{{property.city}
{{property.zipCode}
{{property.rentcludingcharges}}
{{property.charges}}}
{{property.purchasePrice}}
{%if_被授予('ROLE_USER')%}
{%endif%}
{%endfor%}
{%else%}
你有权申请专利吗
{%endif%}

这是N+1问题,我想这会对您有所帮助:非常感谢您告诉我我的问题是什么,但我尝试了不同的方法,但没有找到解决方案。您可以向我展示来自探查器的请求和一个额外请求吗?
{% if properties is defined %}
            {% for property in properties %}
                <tr>
                    <td>{{ property.propertyCategory }}</td>
                    <td>{{ property.uniqueName }}</td>
                    <td>{{ property.address }}</td>
                    <td>{{ property.city }}</td>
                    <td>{{ property.zipCode }}</td>
                    <td>{{ property.rentExcludingCharges }} €</td>
                    <td>{{ property.charges }} €</td>
                    <td>{{ property.purchasePrice }} €</td>
                    <td>
                        <a href="{{ path('property_show', {'id': property.id}) }}">Voir</a>

                        {% if is_granted('ROLE_USER') %}
                            <a href="{{ path('property_edit', {'id': property.id}) }}"><i class="fas fa-edit"></i> édition</a>
                        {% endif %}
                    </td>
                </tr>
            {% endfor %}
        {% else %}
            <tr>
                <td colspan="16">Vous n'avez pas enregistré de propriétés</td>
            </tr>
        {% endif %}