En vedette pour cela pendant plusieurs heures maintenant, peut-être que j'ai manqué quelque chose d'évident.Symfony3 - Les entités ne fonctionnent pas avec les relations (base de données avec les index et les contraintes)
Avoir cette structure de base de données (avec index et contraintes)
CREATE TABLE `exploit` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`edb_id` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`date` datetime not null,
`author` bigint(20) not null ,
`name` varchar(255) not null,
`category` bigint(20) not null,
`version` varchar(255) not null,
`type` bigint(20) not null,
`content` longtext COLLATE utf8_unicode_ci NOT NULL,
`dork` varchar(255) null,
`software_link` varchar(255) null,
`tested_on` varchar(255) null,
PRIMARY KEY (`id`),
KEY `exploit_category_idx` (`category`),
KEY `exploit_type_idx` (`type`),
KEY `exploit_author_idx` (`author`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `category` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `category_name_id_idx` (`id`),
CONSTRAINT `category_name_id` FOREIGN KEY (`id`) REFERENCES `exploit` (`category`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `type` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `type_name_id_idx` (`id`),
CONSTRAINT `type_name_id` FOREIGN KEY (`id`) REFERENCES `exploit` (`type`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `author` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `author_name_id_idx` (`id`),
CONSTRAINT `author_name_id` FOREIGN KEY (`id`) REFERENCES `exploit` (`author`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
créé ces entités:
::::::::::::::
Author.php
::::::::::::::
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use AppBundle\Entity\Exploit;
/**
* Author
*
* @ORM\Table(name="author", indexes={@ORM\Index(name="author_name_id_idx", columns={"id"})})
* @ORM\Entity
*/
class Author
{
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", author="string", length=255, nullable=false)
*/
private $name;
/**
* @ORM\OneToMany(targetEntity="AppBundle\Entity\Exploit", mappedBy="author", cascade={"persist", "remove"})
* @ORM\JoinColumn(name="exploits", referencedColumnName="id")
*/
private $exploits;
/**
* Author constructor.
*/
public function __construct()
{
$this->exploits = new ArrayCollection();
}
/**
* Set name
*
* @param string $name
*
* @return Author
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Get id
*
*/
public function getId()
{
return $this->id;
}
public function __toString()
{
return $this->name;
}
/**
* @param Exploits $exploit
*
* @return Author
*/
public function addExploit($exploit)
{
$this->exploits->add($exploit);
return $this;
}
/**
* @param Collection $exploits
*
* @return Author
*/
public function setExploits(Collection $exploits)
{
$this->exploits->clear();
foreach ($exploits as $exploit) {
$exploit->add($this);
}
$this->exploits = $exploits;
return $this;
}
}
::::::::::::::
Category.php
::::::::::::::
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use AppBundle\Entity\Exploit;
/**
* Category
*
* @ORM\Table(name="category", indexes={@ORM\Index(name="category_name_id_idx", columns={"id"})})
* @ORM\Entity
*/
class Category
{
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", category="string", length=255, nullable=false)
*/
private $name;
/**
* @ORM\OneToMany(targetEntity="AppBundle\Entity\Exploit", mappedBy="category", cascade={"persist", "remove"})
* @ORM\JoinColumn(name="exploits", referencedColumnName="id")
*/
private $exploits;
/**
* Author constructor.
*/
public function __construct()
{
$this->exploits = new ArrayCollection();
}
/**
* Set name
*
* @param string $name
*
* @return Author
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Get id
*
*/
public function getId()
{
return $this->id;
}
public function __toString()
{
return $this->name;
}
/**
* @param Exploits $exploit
*
* @return Author
*/
public function addExploit($exploit)
{
$this->exploits->add($exploit);
return $this;
}
/**
* @param Collection $exploits
*
* @return Author
*/
public function setExploits(Collection $exploits)
{
$this->exploits->clear();
foreach ($exploits as $exploit) {
$exploit->add($this);
}
$this->exploits = $exploits;
return $this;
}
}
::::::::::::::
Exploit.php
::::::::::::::
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use AppBundle\Entity\Author;
use AppBundle\Entity\Type;
use AppBundle\Entity\Category;
/**
* Exploit
*
* @ORM\Table(name="exploit", indexes={@ORM\Index(name=exploit_category_idx", columns={"category"}), @ORM\Index(name="exploit_type_idx", columns={"type"}), @ORM\Index(name="exploit_author_idx", columns={"
author"})})
*/
class Exploit
{
/**
* @var integer
*
* @ORM\Column(name="id", type="bigint", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="edb_id", type="string", length=100, nullable=false)
*/
private $edbId;
/**
* @var \DateTime
*
* @ORM\Column(name="date", type="datetime", nullable=false)
*/
private $date;
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Author", inversedBy="exploits")
* @ORM\JoinColumn(name="author", referencedColumnName="id")
*/
private $author;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255, nullable=false)
*/
private $name;
/**
* @var integer
*
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Category", inversedBy="exploits")
* @ORM\JoinColumn(name="category", referencedColumnName="id")
*/
private $category;
/**
* @var string
*
* @ORM\Column(name="version", type="string", length=255, nullable=false)
*/
private $version;
/**
* @var integer
*
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Type", inversedBy="exploits")
* @ORM\JoinColumn(name="type", referencedColumnName="id")
*/
private $type;
/**
* @var string
*
* @ORM\Column(name="content", type="text", nullable=false)
*/
private $content;
/**
* @var string
*
* @ORM\Column(name="dork", type="string", length=255, nullable=true)
*/
private $dork;
/**
* @var string
*
* @ORM\Column(name="software_link", type="string", length=255, nullable=true)
*/
private $softwareLink;
/**
* @var string
*
* @ORM\Column(name="tested_on", type="string", length=255, nullable=true)
*/
private $testedOn;
/**
* Set edbId
*
* @param integer $edbId
*
* @return Exploit
*/
public function setEdbId($edbId)
{
$this->edbId = $edbId;
return $this;
}
/**
* Get edbId
*
* @return integer
*/
public function getEdbId()
{
return $this->edbId;
}
/**
* Set date
*
* @param \DateTime $date
*
* @return Exploit
*/
public function setDate($date)
{
$this->date = $date;
return $this;
}
/**
* Get date
*
* @return \DateTime
*/
public function getDate()
{
return $this->date;
}
/**
* Set author
*
* @param integer $author
*
* @return Exploit
*/
public function setAuthor($author)
{
$this->author = $author;
return $this;
}
/**
* Get author
*
* @return integer
*/
public function getAuthor()
{
return $this->author;
}
/**
* Set name
*
* @param string $name
*
* @return Exploit
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set category
*
* @param integer $category
*
* @return Exploit
*/
public function setCategory($category)
{
$this->category = $category;
return $this;
}
/**
* Get category
*
* @return integer
*/
public function getCategory()
{
return $this->category;
}
/**
* Set version
*
* @param string $version
*
* @return Exploit
*/
public function setVersion($version)
{
$this->version = $version;
return $this;
}
/**
* Get version
*
* @return string
*/
public function getVersion()
{
return $this->version;
}
/**
* Set type
*
* @param integer $type
*
* @return Exploit
*/
public function setType($type)
{
$this->type = $type;
return $this;
}
/**
* Get type
*
* @return integer
*/
public function getType()
{
return $this->type;
}
/**
* Set content
*
* @param string $content
*
* @return Exploit
*/
public function setContent($content)
{
$this->content = $content;
return $this;
}
/**
* Get content
*
* @return string
*/
public function getContent()
{
return $this->content;
}
/**
* Set dork
*
* @param string $dork
*
* @return Exploit
*/
public function setDork($dork)
{
$this->dork = $dork;
return $this;
}
/**
* Get dork
*
* @return string
*/
public function getDork()
{
return $this->dork;
}
/**
* Set softwareLink
*
* @param string $softwareLink
*
* @return Exploit
*/
public function setSoftwareLink($softwareLink)
{
$this->softwareLink = $softwareLink;
return $this;
}
/**
* Get softwareLink
*
* @return string
*/
public function getSoftwareLink()
{
return $this->softwareLink;
}
/**
* Set testedOn
*
* @param string $testedOn
*
* @return Exploit
*/
public function setTestedOn($testedOn)
{
$this->testedOn = $testedOn;
return $this;
}
/**
* Get testedOn
*
* @return string
*/
public function getTestedOn()
{
return $this->testedOn;
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
}
::::::::::::::
Type.php
::::::::::::::
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use AppBundle\Entity\Exploit;
/**
* Type
*
* @ORM\Table(name="type", indexes={@ORM\Index(name="type_name_id_idx", columns={"id"})})
* @ORM\Entity
*/
class Type
{
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255, nullable=false)
*/
private $name;
/**
* @ORM\OneToMany(targetEntity="AppBundle\Entity\Exploit", mappedBy="type", cascade={"persist", "remove"})
* @ORM\JoinColumn(name="exploits", referencedColumnName="id")
*/
private $exploits;
/**
* Type constructor.
*/
public function __construct()
{
$this->exploits = new ArrayCollection();
}
/**
* Set name
*
* @param string $name
*
* @return Type
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Get id
*
*/
public function getId()
{
return $this->id;
}
public function __toString()
{
return $this->name;
}
/**
* @param Exploits $exploit
*
* @return Type
*/
public function addExploit($exploit)
{
$this->exploits->add($exploit);
return $this;
}
/**
* @param Collection $exploits
*
* @return Type
*/
public function setExploits(Collection $exploits)
{
$this->exploits->clear();
foreach ($exploits as $exploit) {
$exploit->add($this);
}
$this->exploits = $exploits;
return $this;
}
}
mais en quelque sorte quand je fais une requête que je reçois, comme:
$exploits = $this->getDoctrine()
->getRepository('AppBundle:Exploit')
->findAll();
et à vue
<th scope="row"> {{ exploit.id }} </th>
<td> {{ exploit.name }} </td>
<td> {{ exploit.author.name }} </td>
<td> {{ exploit.type.name }} </td>
<td> {{ exploit.category.name }} </td>
<td>{{ exploit.date|date('F j, Y, g:i a') }}</td>
Je reçois cette erreur:
Impossible to access an attribute ("name") on a integer variable ("1").
Toute bonne âme peut regarder cette question et essayer de le reproduire?
MySQL Dump pour recréer les tables avec le contenu est ici:
https://0bin.net/paste/2tV3MEw4A2tdAVsR#R3rBNW4seWkK9HtlJFwbsA6+RmhhWPilm40L8QfeiTp
Merci!
Merci !!! Vous avez le point là. J'ai créé DB à la main. Au début, j'ai créé des entités à partir de la base de données (2 commandes Symfony) et l'ai réglé après avoir lu les tutoriels et les réponses SO. Comment puis-je générer correctement des entités en fonction de mon schéma de base de données ou comment/comment dois-je ajuster pour qu'il fonctionne avec mes entités actuelles? GRAND MERCI! –
:/Toujours pareil ... Impossible d'accéder à un attribut ("nom") sur une variable entière ("1") –
Je remplis DB avec d'autres scripts Python ... cela pourrait-il être le problème? –