Symfony 4.1 и проблемы ассоциации доктрин - PullRequest
0 голосов
/ 29 июня 2018

Я прочитал много сообщений о Stackoverflow и документации доктрины, но не могу найти ошибку в этом коде. Может быть, кто-то может привести меня в правильном направлении, так как я уверен, что не понимаю смысл этой концепции. Это мой первый проект с доктриной.

У меня есть три объекта, и база данных генерируется правильно, но я всегда получаю эти ошибки при выполнении

php ./bin/console доктрина: схема: проверить

сущности следующие (сокращенные):

[FAIL] Недопустимое отображение класса сущностей App \ Entity \ DeployedTrap: * Ассоциация App \ Entity \ DeployedTrap # trapId ссылается на обратную боковое поле App \ Entity \ TrapDefinition # id, которое не определено как ассоциация. * Ссылка на ассоциацию App \ Entity \ DeployedTrap # trapId в поле обратной стороны App \ Entity \ TrapDefinition # id, которое не существовать. * Ассоциация App \ Entity \ DeployedTrap #, на которую ссылается клиент поле обратной стороны App \ Entity \ Customer # customerId, которое не является определяется как ассоциация. * Ассоциация App \ Entity \ DeployedTrap # customer ссылается на обратное боковое поле App \ Entity \ Customer # customerId, который не существует.

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;


/**
 *
 * @ORM\Table(name="traps_deployed")
 * @ORM\Entity(repositoryClass="App\Repository\DeployedTrapRepository")
 */
class DeployedTrap
{
    /**
     * @ORM\Column(name="id", type="integer", options={"unsigned"=true})
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    public $id;

    /**
     * Owning side
     * @ORM\JoinColumn(name="trap_id", referencedColumnName="id")
     * @ORM\ManyToOne(targetEntity="TrapDefinition", inversedBy="id")
     */
    public $trapId;

    /**
     * @ORM\JoinColumn(name="customer", referencedColumnName="customerId")
     * @ORM\ManyToOne(targetEntity="App\Entity\Customer", inversedBy="customerId")
     */
    private $customer;




}

Класс TrapDefinition:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;


/**
 * @ORM\Table(name="traps_definition")
 * @ORM\Entity(repositoryClass="App\Repository\TrapDefinitionRepository")
 */
class TrapDefinition
{
    /**
     * @ORM\Column(name="id",type="integer", options={"unsigned"=true})
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\OneToMany(targetEntity="DeployedTrap", mappedBy="trapId")
     */
    public $id;





    public function __construct()
    {
        $this->id = new ArrayCollection();
    }


}

класс Заказчик:

    namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\Events;
use Doctrine\Common\Collections\ArrayCollection;


/**
 * @ORM\Table(name="customers")
 * @ORM\Entity(repositoryClass="Doctrine\ORM\EntityRepository")
 * @ORM\HasLifecycleCallbacks
 */
class Customer
{
    /**
     * @ORM\Column(type="integer",name="customerId",length=11, nullable=false, options={"unsigned"=true})
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\OneToMany(targetEntity="DeployedTrap", mappedBy="customer")
     */
    public $customerId;




    public function __construct()
    {
        $this->customerId = new ArrayCollection();

    }


}

1 Ответ

0 голосов
/ 29 июня 2018

Во-первых: Забудьте о подходе к базам данных для связывания моделей с помощью идентификаторов (см. $trapId в вашем DeployerTrap) в Doctrine. Вы всегда будете связывать объекты / коллекции друг с другом, поэтому $trapId должно быть $trapDefinition.

И это ваша главная проблема здесь

Просто добавьте поле $deployerTraps к вашему TrapDefinition классу

/**
* @ORM\OneToMany(targetEntity="DeployedTrap", mappedBy="trapDefinition")
*/
public $deployerTraps;

И переименуйте $trapId в $trapDefinition в вашем DeployedTrap классе

/**
 * @ORM\ManyToOne(targetEntity="TrapDefinition", inversedBy="deployerTraps")
 */
public $trapDefinition;
...