Я пытаюсь создать форму поиска, чтобы найти проекты по названию компании-заказчика.

Мой клиент

<?php

namespace ProjectBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Intl\Intl;

/**
 * Client
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="ProjectBundle\Entity\CustomerRepository")
 */
 class Customer {

/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 *
 * @ORM\Column(name="company_name", type="string", length=255)
 */
private $companyName;

/**
 * @var string
 *
 * @ORM\Column(name="contact_name", type="string", length=127)
 */
private $contactName;

/**
 * @var string
 *
 * @ORM\Column(name="contact_function", type="string", length=127)
 */
private $contactFunction;

/**
 * @var string
 *
 * @ORM\Column(name="contact_phone", type="string", length=64)
 */
private $contactPhone;

/**
 * @var string
 *
 * @ORM\Column(name="contact_mobile_phone", type="string", length=64)
 */
private $contactMobilePhone;

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

/**
 * @var string
 *
 * @ORM\Column(name="country", type="string", length=2)
 */
private $country;

/**
 * @var boolean
 *
 * @ORM\Column(name="actif", type="boolean")
 */
private $actif;

/**
 * @var \DateTime
 *
 * @ORM\Column(name="created_at", type="datetime")
 */
private $createdAt;

/**
 * @var \DateTime
 *
 * @ORM\Column(name="updated_at", type="datetime")
 */
private $updatedAt;

public function __construct() {
    // Par défaut, la date de l'annonce est la date d'aujourd'hui
    $this->createdAt = new \Datetime();
    $this->actif = true;
}

/**
 * Get id
 *
 * @return integer
 */
public function getId() {
    return $this->id;
}

/**
 * Set companyName
 *
 * @param string $companyName
 *
 * @return Client
 */
public function setCompanyName($companyName) {
    $this->updatedAt = new \DateTime();
    $this->companyName = $companyName;

    return $this;
}

/**
 * Get companyName
 *
 * @return string
 */
public function getCompanyName() {
    return $this->companyName;
}

/**
 * Set contactName
 *
 * @param string $contactName
 *
 * @return Client
 */
public function setContactName($contactName) {
    $this->contactName = $contactName;

    return $this;
}

/**
 * Get contactName
 *
 * @return string
 */
public function getContactName() {
    return $this->contactName;
}

/**
 * Set contactPhone
 *
 * @param string $contactPhone
 *
 * @return Client
 */
public function setContactPhone($contactPhone) {
    $this->contactPhone = $contactPhone;

    return $this;
}

/**
 * Get contactPhone
 *
 * @return string
 */
public function getContactPhone() {
    return $this->contactPhone;
}

/**
 * Set contactMobilePhone
 *
 * @param string $contactMobilePhone
 *
 * @return Client
 */
public function setContactMobilePhone($contactMobilePhone) {
    $this->contactMobilePhone = $contactMobilePhone;

    return $this;
}

/**
 * Get contactMobilePhone
 *
 * @return string
 */
public function getContactMobilePhone() {
    return $this->contactMobilePhone;
}

/**
 * Set contactFunction
 *
 * @param string $contactFunction
 *
 * @return Client
 */
public function setContactFunction($contactFunction) {
    $this->contactFunction = $contactFunction;

    return $this;
}

/**
 * Get contactFunction
 *
 * @return string
 */
public function getContactFunction() {
    return $this->contactFunction;
}

/**
 * Set town
 *
 * @param string $town
 *
 * @return Client
 */
public function setTown($town) {
    $this->town = $town;

    return $this;
}

/**
 * Get town
 *
 * @return string
 */
public function getTown() {
    return $this->town;
}

/**
 * Set country
 *
 * @param string $country
 *
 * @return Client
 */
public function setCountry($country) {
    $this->country = $country;

    return $this;
}

/**
 * Get country
 *
 * @return string
 */
public function getCountry() {
    return $this->country;
}

/**
 * Set actif
 *
 * @param boolean $actif
 *
 * @return Client
 */
public function setActif($actif) {
    $this->actif = $actif;
}

/**
 * Get actif
 *
 * @return boolean
 */
public function getActif() {
    return $this->actif;
}

/**
 * Set createdAt
 *
 * @param \DateTime $createdAt
 *
 * @return Client
 */
public function setCreatedAt($createdAt) {
    $this->createdAt = $createdAt;

    return $this;
}

/**
 * Get createdAt
 *
 * @return \DateTime
 */
public function getCreatedAt() {
    return $this->createdAt;
}

/**
 * Set updatedAt
 *
 * @param \DateTime $updatedAt
 *
 * @return Client
 */
public function setUpdatedAt($updatedAt) {
    $this->updatedAt = $updatedAt;

    return $this;
}

/**
 * Get updatedAt
 *
 * @return \DateTime
 */
public function getUpdatedAt() {
    return $this->updatedAt;
}

public function getCountryName() {
    return Intl::getRegionBundle()->getCountryName($this->getCountry());
}

public function __toString() {
    return $this->getCompanyName();
}

}

Мой проект

<?php

 namespace ProjectBundle\Entity;

 use Doctrine\ORM\Mapping as ORM;
 use Doctrine\Common\Collections\ArrayCollection;
 use Symfony\Component\Intl\Intl;
 use ProjectBundle\Entity\Customer;
 use ProjectBundle\Entity\Construction;
 use ProjectBundle\Entity\ProjectState as State;

 /**
  * Project
  *
  * @ORM\Table()
  * @ORM\Entity(repositoryClass="ProjectBundle\Entity\ProjectRepository")
  */
 class Project {

/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

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

/**
 * @ORM\ManyToOne(targetEntity="\ProjectBundle\Entity\Customer") 
 */
private $customer;

/**
 * @var string
 *
 * @ORM\Column(name="project_code", type="string", length=127)
 */
private $projectCode;

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

/**
 * @var string
 *
 * @ORM\Column(name="country", type="string", length=2)
 */
private $country;

/**
 * @ORM\OneToMany(targetEntity="\ProjectBundle\Entity\Construction", mappedBy="project")
 * @ORM\JoinColumn(name="project_id", referencedColumnName="id", nullable=true) 
 */
private $constructions;

/**
 * @ORM\ManyToOne(targetEntity="\ProjectBundle\Entity\ProjectState", inversedBy="code") 
 * @ORM\JoinColumn(name="state_code", referencedColumnName="code")
 */
private $state;

/**
 * @var \DateTime
 *
 * @ORM\Column(name="created_at", type="datetime")
 */
private $createdAt;

/**
 * @var \DateTime
 *
 * @ORM\Column(name="updated_at", type="datetime")
 */
private $updatedAt;

public function __construct() {
    // Par défaut, la date de l'annonce est la date d'aujourd'hui
    $this->createdAt = new \Datetime();
    $this->constructions = new ArrayCollection();
}

/**
 * Get id
 *
 * @return integer
 */
public function getId() {
    return $this->id;
}

/**
 * Set name
 *
 * @param string $name
 *
 * @return Project
 */
public function setName($name) {
    $this->updatedAt = new \DateTime();
    $this->name = $name;

    return $this;
}

/**
 * Get name
 *
 * @return string
 */
public function getName() {
    return $this->name;
}

/**
 * Set customer
 *
 * @param string $customer
 *
 * @return Project
 */
public function setCustomer(Customer $customer) {
    $this->customer = $customer;

    return $this;
}

/**
 * Get gamme
 *
 * @return Customer
 */
public function getCustomer() {
    return $this->customer;
}

/**
 * Set projectCode
 *
 * @param string $projectCode
 *
 * @return Project
 */
public function setProjectCode($projectCode) {
    $this->projectCode = $projectCode;

    return $this;
}

/**
 * Get projectCode
 *
 * @return string
 */
public function getProjectCode() {
    return $this->projectCode;
}

/**
 * Set location
 *
 * @param string $location
 *
 * @return Location
 */
public function setLocation($location) {
    $this->location = $location;

    return $this;
}

/**
 * Get location
 *
 * @return string
 */
public function getLocation() {
    return $this->location;
}

/**
 * Set country
 *
 * @param string $country
 *
 * @return Project
 */
public function setCountry($country) {
    $this->country = $country;

    return $this;
}

/**
 * Get country
 *
 * @return string
 */
public function getCountry() {
    return $this->country;
}

public function addConstruction(Construction $construction) {
    $this->constructions[] = $construction;

    return $this;
}

public function removeConstruction(Construction $construction) {
    $this->constructions->removeElement($construction);
}

/**
 * @return Collection
 */
public function getConstructions() {
    return $this->constructions;
}

    /**
 * Set state
 *
 * @param smallint $state
 *
 * @return Project
 */
public function setState(State $state) {
    $this->state = $state;

    return $this;
}

/**
 * Get state
 *
 * @return State
 */
public function getState() {
    return $this->state;
}

/**
 * Set createdAt
 *
 * @param \DateTime $createdAt
 *
 * @return Project
 */
public function setCreatedAt($createdAt) {
    $this->createdAt = $createdAt;

    return $this;
}

/**
 * Get createdAt
 *
 * @return \DateTime
 */
public function getCreatedAt() {
    return $this->createdAt;
}

/**
 * Set updatedAt
 *
 * @param \DateTime $updatedAt
 *
 * @return Project
 */
public function setUpdatedAt($updatedAt) {
    $this->updatedAt = $updatedAt;

    return $this;
}

/**
 * Get updatedAt
 *
 * @return \DateTime
 */
public function getUpdatedAt() {
    return $this->updatedAt;
}

public function getCountryName() {
    return Intl::getRegionBundle()->getCountryName($this->getCountry());
}

    public function __toString() {
    return $this->getName();
}

}

FormType

<?php

 namespace ProjectBundle\Form;

 use Symfony\Component\Form\AbstractType;
 use Symfony\Component\Form\FormBuilderInterface;
 use Symfony\Component\OptionsResolver\OptionsResolverInterface;
 use Symfony\Component\Form\Extension\Core\Type\TextType;
 use ProjectBundle\Entity\ProjectStateRepository;

class ProjectSearchType extends AbstractType {

/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options) {


    $builder
            ->add('companyName', TextType::class, array('required' => false))
            ->add('state', 'entity', array(
                'query_builder' => function(ProjectStateRepository $repository) {
                    return $repository->createQueryBuilder('s')->orderBy('s.position', 'ASC');
                },
                'class' => 'ProjectBundle:ProjectState',
                'property' => 'state',
                'placeholder' => 'Etat',
                'required' => false
                    )
            )
            ->add('Filtrer', 'submit')
    ;
}

/**
 * @param OptionsResolverInterface $resolver
 */
public function setDefaultOptions(OptionsResolverInterface $resolver) {
    $resolver->setDefaults(array(
        'data_class' => 'ProjectBundle\Entity\Project'
    ));
}

/**
 * @return string
 */
public function getName() {
    return 'projectbundle_project_search';
}

}

Моя форма вызова в моем контроллере:

$form = $this->get('form.factory')->create(new ProjectSearchType());

Выписка из репо проекта:

     public function findProjectByParameters($data) {
    $query = $this->createQueryBuilder('p');

    if ($data['companyName']) {
        $query->innerJoin("p.customer", "c", "WITH", 'c.companyName LIKE :companyName')
                ->setParameter('companyName', '%' . $data['companyName'] . '%');
    }

    if ($data['state']) {
        $query->andWhere('p.state LIKE :state')
                ->setParameter('state', $data['state']);
    }



    $query->orderBy('p.name', 'ASC');

    return $query->getQuery()->getResult();
}

Когда я запускаю поиск, я вижу эту ошибку:

Ни свойство "companyName", ни один из методов "getCompanyName ()", "companyName ()", "isCompanyName ()", "hasCompanyName ()", "__get ()" не существуют и не имеют открытого доступа в классе "ProjectBundle \" Entity \ Project » .

Я не понимаю, почему это относится к объекту проекта ...

Я хочу получить строку и искать ее в compagnyName объекта Customer в присоединении ...

Я не знаю, как передать аргумент, который не должен быть атрибутом Project ...

0
Gilles Lengy 24 Апр 2017 в 12:04

2 ответа

Лучший ответ

На первый взгляд я бы сказал ... удалите этот метод, и он может работать.

/**
 * @param OptionsResolverInterface $resolver
 */
public function setDefaultOptions(OptionsResolverInterface $resolver) {
    $resolver->setDefaults(array(
        'data_class' => 'ProjectBundle\Entity\Project'
    ));
}

Вы указываете типу формы, что он представляет собой Project объект. Нравится для создания / редактирования проектов. Это не то, что вы хотите. Вы хотите, чтобы ваша форма действовала независимо от вашей сущности, а затем с помощью ввода формы тоже отфильтровывает набор результатов.

Если вы хотите установить другие параметры, вам, конечно, нужен метод setDefaultOptions. Так что, по крайней мере, удалите 'data_class' => 'ProjectBundle\Entity\Project'.

2
Markus Kottländer 24 Апр 2017 в 11:03

Эта ошибка генерируется, потому что ваш класс формы имеет поле с именем companyName, будучи привязанным к классу данных «Project», который не содержит такого метода получения / установки.

Если вам нужно добавить поля, которые не записаны в класс объекта, к которому привязана форма, вы можете установить для параметра «mapped» значение false:

->add('companyName', TextType::class, array('mapped' => false, 'required' => false))

В качестве альтернативы, если ваша форма вообще не нуждается в классе данных, вы можете просто удалить атрибут data_class из параметров по умолчанию для формы.

1
jawish 24 Апр 2017 в 13:26