Doctrine mapping with Symfony 2 for foreign key - symfony

I am currently facing one problem with mapping I hope some one would helpe me.
I have two table describe bellow..
unitid(primary_key, column_1)
For example data here
unitid(1,22)
unitid (2,33)
mappaths(primary key, forign_key (column_1), forign_key(column_1))
For example data here
mappaths (1,22,33)
mappaths (2,33,22)
unitid has some kind of units defines while this mappaths table define the specific paths based on the unitid
Now when I run the doctrain2 mapping It give me some kind these entities pluse these following mapping information
Entity class
<?php
namespace ApiMaps\ApiMapBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Mappaths
*
* #ORM\Table(name="mappaths", indexes={#ORM\Index(name="idx_45b7519fa3995845", columns={"ref_unitids1"}), #ORM\Index(name="idx_45b7519f3a9009ff", columns={"ref_unitids2"})})
* #ORM\Entity
*/
class Mappaths
{
/**
* #var integer
*
* #ORM\Column(name="id", type="integer", nullable=false)
* #ORM\Id
* #ORM\GeneratedValue(strategy="SEQUENCE")
* #ORM\SequenceGenerator(sequenceName="mappaths_id_seq", allocationSize=1, initialValue=1)
*/
private $id;
/**
* #var integer
*
* #ORM\Column(name="normalvalue", type="smallint", nullable=true)
*/
private $normalvalue;
/**
*
* #var \Unitids
* #ORM\ManyToOne(targetEntity="Unitids",cascade={"all"},fetch="LAZY")
* #ORM\JoinColumns({
* #ORM\JoinColumn(name="ref_unitids2", referencedColumnName="databaseid")
* })
*/
private $refUnitids2;
/**
* #var \Unitids
* #ORM\ManyToOne(targetEntity="Unitids",cascade={"all"},fetch="LAZY")
* #ORM\JoinColumns({
* #ORM\JoinColumn(name="ref_unitids1", referencedColumnName="databaseid")
* })
*/
private $refUnitids1;
/**
* Set normalvalue
*
* #param integer $normalvalue
*
* #return Mappaths
*/
public function setNormalvalue($normalvalue)
{
$this->normalvalue = $normalvalue;
return $this;
}
/**
* Get normalvalue
*
* #return integer
*/
public function getNormalvalue()
{
return $this->normalvalue;
}
/**
* Get id
*
* #return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set refUnitids1
*
* #param \ApiMaps\ApiMapBundle\Entity\Unitids $refUnitids1
*
* #return Mappaths
*/
public function setRefUnitids1(\ApiMaps\ApiMapBundle\Entity\Unitids $refUnitids1 = null)
{
$this->refUnitids1 = $refUnitids1;
return $this;
}
/**
* Get refUnitids1
*
* #return \ApiMaps\ApiMapBundle\Entity\Unitids
*/
public function getRefUnitids1()
{
return $this->refUnitids1;
}
/**
* Set refUnitids2
*
* #param \ApiMaps\ApiMapBundle\Entity\Unitids $refUnitids2
*
* #return Mappaths
*/
public function setRefUnitids2(\ApiMaps\ApiMapBundle\Entity\Unitids $refUnitids2 = null)
{
$this->refUnitids2 = $refUnitids2;
return $this;
}
/**
* Get refUnitids2
*
* #return \ApiMaps\ApiMapBundle\Entity\Unitids
*/
public function getRefUnitids2()
{
return $this->refUnitids2;
}
}
and mappaths.php
<?php
namespace ApiMaps\ApiMapBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Mappaths
*
* #ORM\Table(name="mappaths", indexes={#ORM\Index(name="idx_45b7519fa3995845", columns={"ref_unitids1"}), #ORM\Index(name="idx_45b7519f3a9009ff", columns={"ref_unitids2"})})
* #ORM\Entity
*/
class Mappaths
{
/**
* #var integer
*
* #ORM\Column(name="id", type="integer", nullable=false)
* #ORM\Id
* #ORM\GeneratedValue(strategy="SEQUENCE")
* #ORM\SequenceGenerator(sequenceName="mappaths_id_seq", allocationSize=1, initialValue=1)
*/
private $id;
/**
* #var integer
*
* #ORM\Column(name="normalvalue", type="smallint", nullable=true)
*/
private $normalvalue;
/**
*
* #var \Unitids
* #ORM\ManyToOne(targetEntity="Unitids",cascade={"all"},fetch="LAZY")
* #ORM\JoinColumns({
* #ORM\JoinColumn(name="ref_unitids2", referencedColumnName="databaseid")
* })
*/
private $refUnitids2;
/**
* #var \Unitids
* #ORM\ManyToOne(targetEntity="Unitids",cascade={"all"},fetch="LAZY")
* #ORM\JoinColumns({
* #ORM\JoinColumn(name="ref_unitids1", referencedColumnName="databaseid")
* })
*/
private $refUnitids1;
/**
* Set normalvalue
*
* #param integer $normalvalue
*
* #return Mappaths
*/
public function setNormalvalue($normalvalue)
{
$this->normalvalue = $normalvalue;
return $this;
}
/**
* Get normalvalue
*
* #return integer
*/
public function getNormalvalue()
{
return $this->normalvalue;
}
/**
* Get id
*
* #return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set refUnitids1
*
* #param \ApiMaps\ApiMapBundle\Entity\Unitids $refUnitids1
*
* #return Mappaths
*/
public function setRefUnitids1(\ApiMaps\ApiMapBundle\Entity\Unitids $refUnitids1 = null)
{
$this->refUnitids1 = $refUnitids1;
return $this;
}
/**
* Get refUnitids1
*
* #return \ApiMaps\ApiMapBundle\Entity\Unitids
*/
public function getRefUnitids1()
{
return $this->refUnitids1;
}
/**
* Set refUnitids2
*
* #param \ApiMaps\ApiMapBundle\Entity\Unitids $refUnitids2
*
* #return Mappaths
*/
public function setRefUnitids2(\ApiMaps\ApiMapBundle\Entity\Unitids $refUnitids2 = null)
{
$this->refUnitids2 = $refUnitids2;
return $this;
}
/**
* Get refUnitids2
*
* #return \ApiMaps\ApiMapBundle\Entity\Unitids
*/
public function getRefUnitids2()
{
return $this->refUnitids2;
}
}
now when I run the project it give me the following error
37. public static function missingPrimaryKeyValue($className, $idField)
38. {
39. return new self(sprintf("Missing value for primary key %s on %s", $idField, $className));
40. }
41. }
It seems to me that this primary key of unitsid could not get by mapping
Any solution would be appreciated

First I think you haven't understand the ORM (object relational mapping) concept in your entities you don't map these relations by foreign keys, doctrine will do it for you, in the entities layer you have to map objects and only objects
Second you need to map your entities relations by using orm annotations or xml configuration to describe those relations if they are oneToOne or ManyToOne or OneToMany or ManyToMany relation
Third You are having this error because you haven't set a value to the entity id, to do that you have two options : auto generate the id or set it manually before persisting object
see this

Related

Symfony2 entity Time type return format

I have entity for saving place's working time:
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* WorkingTime
*
* #ORM\Table(name="working_time")
* #ORM\Entity(repositoryClass="AppBundle\Repository\WorkingTimeRepository")
*/
class WorkingTime
{
/**
* #var int
*
* #ORM\Column(name="id", type="integer")
* #ORM\Id
* #ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* #var int
*
* #ORM\Column(name="day", type="smallint")
*/
private $day;
/**
* #var \DateTime
*
* #ORM\Column(name="start", type="time")
*/
private $start;
/**
* #var \DateTime
*
* #ORM\Column(name="end", type="time")
*/
private $end;
/**
* Get id
*
* #return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set day
*
* #param integer $day
*
* #return WorkingTime
*/
public function setDay($day)
{
$this->day = $day;
return $this;
}
/**
* Get day
*
* #return integer
*/
public function getDay()
{
return $this->day;
}
/**
* Set start
*
* #param \DateTime $start
*
* #return WorkingTime
*/
public function setStart($start)
{
$this->start = $start;
return $this;
}
/**
* Get start
*
* #return \DateTime
*/
public function getStart()
{
return $this->start;
}
/**
* Set end
*
* #param \DateTime $end
*
* #return WorkingTime
*/
public function setEnd($end)
{
$this->end = $end;
return $this;
}
/**
* Get end
*
* #return \DateTime
*/
public function getEnd()
{
return $this->end;
}
}
But when I try to display retrieve it, time fields are converted to something like:
{
"id": 16,
"day": 2,
"start": "1970-01-01T07:00:00+0000",
"end": "1970-01-01T00:00:00+0000"
},
Is it possible, that it gets converted by FOSRestBundle? How can I get rid of it and get only HH:mm, instead of 1970-01-01T00:00:00+0000?
The FOSRestBundle serialises objects before render them.
To do this, you need to choose between the built-in Symfony serializer or the JMSSerializer.
As you don't manually use one of them for now, and because it provides a solution for this specific problem, I will give the solution for do it using the JMSSerializer.
To use it, you need only to follow the installation chapter of the documentation.
Then, in your entity, use the #Type annotation on the time properties :
use JMS\Serializer\Annotation as JMS;
// ...
/**
* #JMS\Type("DateTime<'H:i'>")
* #ORM\Column(name="start", type="time")
*/
private $start;
/**
* #JMS\Type("DateTime<'H:i'>")
* #ORM\Column(name="end", type="time")
*/
private $end;
Now, your properties will be rendered as 07:00 instead of 1970-01-01T07:00:00+0000.

Symfony Insert Foreign Key Value

I have 3 tables: EdiTradingPartner, EdiDocType and EdiTradingPartnerTransactions
src\Matrix\MatrixEdiBundle\Entity\EdiTradingPartner
namespace Matrix\MatrixEdiBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* EdiTradingPartner
*
* #ORM\Table(name="edi_trading_partner")
* #ORM\Entity(repositoryClass="Matrix\MatrixEdiBundle\Repository\EdiTradingPartnerRepository")
*/
class EdiTradingPartner
{
/**
* #var string
*
* #ORM\Column(name="edi_interchange_id", type="string", length=30, nullable=false)
*/
private $ediInterchangeId;
/**
* #var string
*
* #ORM\Column(name="tp_name", type="string", length=30, nullable=false)
*/
private $tpName;
/**
* #var string
*
* #ORM\Column(name="tp_location", type="string", length=50, nullable=false)
*/
private $tpLocation;
/**
* #var integer
*
* #ORM\Column(name="edi_trading_partner_id", type="integer")
* #ORM\Id
* #ORM\GeneratedValue(strategy="IDENTITY")
*/
private $ediTradingPartnerId;
/**
* Set ediInterchangeId
*
* #param string $ediInterchangeId
* #return EdiTradingPartner
*/
public function setEdiInterchangeId($ediInterchangeId)
{
$this->ediInterchangeId = $ediInterchangeId;
return $this;
}
/**
* Get ediInterchangeId
*
* #return string
*/
public function getEdiInterchangeId()
{
return $this->ediInterchangeId;
}
/**
* Set tpName
*
* #param string $tpName
* #return EdiTradingPartner
*/
public function setTpName($tpName)
{
$this->tpName = $tpName;
return $this;
}
/**
* Get tpName
*
* #return string
*/
public function getTpName()
{
return $this->tpName;
}
/**
* Set tpLocation
*
* #param string $tpLocation
* #return EdiTradingPartner
*/
public function setTpLocation($tpLocation)
{
$this->tpLocation = $tpLocation;
return $this;
}
/**
* Get tpLocation
*
* #return string
*/
public function getTpLocation()
{
return $this->tpLocation;
}
/**
* Get ediTradingPartnerId
*
* #return integer
*/
public function getEdiTradingPartnerId()
{
return $this->ediTradingPartnerId;
}
}
src\Matrix\MatrixEdiBundle\Entity\EdiDocType
<?php
namespace Matrix\MatrixEdiBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* EdiDocType
*
* #ORM\Table(name="edi_doc_type")
* #ORM\Entity(repositoryClass="Matrix\MatrixEdiBundle\Repository\EdiDocTypeRepository")
*/
class EdiDocType
{
/**
* #var integer
*
* #ORM\Column(name="doc_type", type="integer", nullable=false)
*/
private $docType;
/**
* #var string
*
* #ORM\Column(name="name", type="string", length=50, nullable=false)
*/
private $name;
/**
* #var string
*
* #ORM\Column(name="description", type="string", length=255, nullable=false)
*/
private $description;
/**
* #var string
*
* #ORM\Column(name="direction", type="string", length=10, nullable=false)
*/
private $direction;
/**
* #var integer
*
* #ORM\Column(name="edi_doc_type_id", type="integer")
* #ORM\Id
* #ORM\GeneratedValue(strategy="IDENTITY")
*/
private $ediDocTypeId;
/**
* Set docType
*
* #param integer $docType
* #return EdiDocType
*/
public function setDocType($docType)
{
$this->docType = $docType;
return $this;
}
/**
* Get docType
*
* #return integer
*/
public function getDocType()
{
return $this->docType;
}
/**
* Set name
*
* #param string $name
* #return EdiDocType
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* #return string
*/
public function getName()
{
return $this->name;
}
/**
* Set description
*
* #param string $description
* #return EdiDocType
*/
public function setDescription($description)
{
$this->description = $description;
return $this;
}
/**
* Get description
*
* #return string
*/
public function getDescription()
{
return $this->description;
}
/**
* Set direction
*
* #param string $direction
* #return EdiDocType
*/
public function setDirection($direction)
{
$this->direction = $direction;
return $this;
}
/**
* Get direction
*
* #return string
*/
public function getDirection()
{
return $this->direction;
}
/**
* Get ediDocTypeId
*
* #return integer
*/
public function getEdiDocTypeId()
{
return $this->ediDocTypeId;
}
}
src\Matrix\MatrixEdiBundle\Entity\EdiTradingPartnerTransactions
namespace Matrix\MatrixEdiBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* EdiTradingPartnerTransactions
*
* #ORM\Table(name="edi_trading_partner_transactions", indexes={#ORM\Index(name="edi_tp_id", columns={"edi_tp_id", "edi_doc_type_id"}), #ORM\Index(name="edi_transactions_id", columns={"edi_doc_type_id"}), #ORM\Index(name="IDX_F2BE50F7B9C737A1", columns={"edi_tp_id"})})
* #ORM\Entity(repositoryClass="Matrix\MatrixEdiBundle\Repository\EdiTradingPartnerTransactionsRepository")
*/
class EdiTradingPartnerTransactions
{
/**
* #var integer
*
* #ORM\Column(name="edi_tp_transactions_id", type="integer")
* #ORM\Id
* #ORM\GeneratedValue(strategy="IDENTITY")
*/
private $ediTpTransactionsId;
/**
* #var \Matrix\MatrixEdiBundle\Entity\EdiDocType
*
* #ORM\ManyToOne(targetEntity="Matrix\MatrixEdiBundle\Entity\EdiDocType")
* #ORM\JoinColumns({
* #ORM\JoinColumn(name="edi_doc_type_id", referencedColumnName="edi_doc_type_id")
* })
*/
private $ediDocType;
/**
* #var \Matrix\MatrixEdiBundle\Entity\EdiTradingPartner
*
* #ORM\ManyToOne(targetEntity="Matrix\MatrixEdiBundle\Entity\EdiTradingPartner")
* #ORM\JoinColumns({
* #ORM\JoinColumn(name="edi_tp_id", referencedColumnName="edi_trading_partner_id")
* })
*/
private $ediTp;
/**
* Get ediTpTransactionsId
*
* #return integer
*/
public function getEdiTpTransactionsId()
{
return $this->ediTpTransactionsId;
}
/**
* Set ediDocType
*
* #param \Matrix\MatrixEdiBundle\Entity\EdiDocType $ediDocType
* #return EdiTradingPartnerTransactions
*/
public function setEdiDocType(\Matrix\MatrixEdiBundle\Entity\EdiDocType $ediDocType = null)
{
$this->ediDocType = $ediDocType;
return $this;
}
/**
* Get ediDocType
*
* #return \Matrix\MatrixEdiBundle\Entity\EdiDocType
*/
public function getEdiDocType()
{
return $this->ediDocType;
}
/**
* Set ediTp
*
* #param \Matrix\MatrixEdiBundle\Entity\EdiTradingPartner $ediTp
* #return EdiTradingPartnerTransactions
*/
public function setEdiTp(\Matrix\MatrixEdiBundle\Entity\EdiTradingPartner $ediTp = null)
{
$this->ediTp = $ediTp;
return $this;
}
/**
* Get ediTp
*
* #return \Matrix\MatrixEdiBundle\Entity\EdiTradingPartner
*/
public function getEdiTp()
{
return $this->ediTp;
}
}
I want to insert into EdiTradingPartnerTransactions table yet I really don't know what to do since I've been receiving this error:
Catchable fatal error: Argument 1 passed to
Matrix\MatrixEdiBundle\Entity\EdiTradingPartnerTransactions::setEdiTp()
must be an instance of
Matrix\MatrixEdiBundle\Entity\EdiTradingPartner, string given, called
in
C:\xampp\htdocs\Editracker\src\Matrix\MatrixEdiBundle\Controller\MatrixController.php
on line 474 and defined in
C:\xampp\htdocs\Editracker\src\Matrix\MatrixEdiBundle\Entity\EdiTradingPartnerTransactions.php
on line 85
Here's my function in the controller side:
public function deleteTpTransAction($tpId, $docType, $direction, $tpName) {
$em = $this->getDoctrine()->getManager();
$docTypeId = $em->getRepository('MatrixEdiBundle:EdiDocType')->getId($docType, $direction);
if ($docTypeId != null) {
$result = $em->getRepository('MatrixEdiBundle:EdiTradingPartnerTransactions')->getTpTrans($tpId, $docType, $direction);
if ($result == null) {
$transaction = new EdiTradingPartnerTransactions();
$transaction->setEdiTp($tpId);
$transaction->setEdiDocType($docTypeId);
$em->persist($transaction);
} else {
foreach ($result as $key) {
$id = $key->getEdiTpTransactionsId();
$transaction = $em->getRepository('MatrixEdiBundle:EdiTradingPartnerTransactions')->find($id);
$em->remove($transaction);
}
}
$em->flush();
}
return $this->redirect($this->generateUrl('matrix_edi_tpTrans'));
}
Any help would really be appreciated. Thanks in advanced!
The error here is pretty clear: Doctrine handle, at least for relationships, only objects of the "related" (let's call that way) entity.
When you do
$transaction->setEdiTp($tpId);
$transaction->setEdiDocType($docTypeId);
you're trying to insert ID(s) of related objects. This is an error: although your db expects an integer (foreign key), Doctrine is an abstaction "pillow" between your code and db; it choose to work with objects and not with ids(you can see it pretty clearly into entity classes files)
Solution here is pretty simple:
Fetch from db the entity for setEdiTp and setEdiDocType
Pass them to the functions
In PHP (Symfony):
$ediTp = $em
->getRepository('MatrixEdiBundle:EdiTp')
->findOneById($tpId);
$ediDocType = $em
->getRepository('MatrixEdiBundle:EdiDocType')
->findOneById($docTypeId);
then
$transaction->setEdiTp($ediTp);
$transaction->setEdiDocType($ediDocType);
Your error is because setEdiTp need an instance of EdiTradingPartner.
Your error say string given.
Because $tpId is string.
Verify
Change
$transaction->setEdiTp($tpId);
To
// $transaction->setEdiTp($tpId);
var_dump($tpId);
Normally, $tpId return a string, not a object.
So when you call deleteTpTransAction, $tpId must be an instance of setEdiTp
Changement :
$editp = $em->getRepository('MatrixEdiBundle:EdiTradingPartner')->find($tpId);
and change
$transaction->setEdiTp($tpId);
by
$transaction->setEdiTp($editTp);

Symfony2 Datetime format

I'm trying to add a simple comment entity, with the "postedOn" attribute as a Datetime. Whenever I try to add a comment, I get this error :
Error: Call to undefined method Symfony\Component\Validator\Constraints\DateTime::format() in /var/www/vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/DateTimeType.php line 53
Any idea ?
Here's the entity code :
<?php
namespace AOFVH\FlyBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Comment
*
* #ORM\Table()
* #ORM\Entity(repositoryClass="AOFVH\FlyBundle\Entity\CommentRepository")
*/
class Comment
{
/**
* #var integer
*
* #ORM\Column(name="id", type="integer")
* #ORM\Id
* #ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* #var integer
*
* #ORM\Column(name="rating", type="integer")
*/
private $rating;
/**
* #ORM\Column(type="datetime", nullable=true)
*/
protected $postedon;
/**
* #var string
*
* #ORM\Column(name="text", type="text")
*/
private $text;
/**
* #var $commenter
*
* #ORM\ManyToOne(targetEntity="AOFVH\UserBundle\Entity\User", inversedBy="comments", cascade={"persist", "merge"})
*/
private $commenter;
/**
* #var $commenter
*
* #ORM\ManyToOne(targetEntity="AOFVH\FlyBundle\Entity\Flight", inversedBy="comments", cascade={"persist", "merge"})
*/
private $flight;
/**
* Get id
*
* #return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set rating
*
* #param integer $rating
* #return Comment
*/
public function setRating($rating)
{
$this->rating = $rating;
return $this;
}
/**
* Get rating
*
* #return integer
*/
public function getRating()
{
return $this->rating;
}
/**
* Set text
*
* #param string $text
* #return Comment
*/
public function setText($text)
{
$this->text = $text;
return $this;
}
/**
* Get text
*
* #return string
*/
public function getText()
{
return $this->text;
}
/**
* Set commenter
*
* #param \AOFVH\UserBundle\Entity\User $commenter
* #return Comment
*/
public function setCommenter(\AOFVH\UserBundle\Entity\User $commenter = null)
{
$this->commenter = $commenter;
return $this;
}
/**
* Get commenter
*
* #return \AOFVH\UserBundle\Entity\User
*/
public function getCommenter()
{
return $this->commenter;
}
/**
* Set flight
*
* #param \AOFVH\FlyBundle\Entity\Flight $flight
* #return Comment
*/
public function setFlight(\AOFVH\FlyBundle\Entity\Flight $flight = null)
{
$this->flight = $flight;
return $this;
}
/**
* Get flight
*
* #return \AOFVH\FlyBundle\Entity\Flight
*/
public function getFlight()
{
return $this->flight;
}
Here are the postedOn getters and setters
/**
* Set postedon
*
* #param \DateTime $postedon
* #return Comment
*/
public function setPostedon($postedon)
{
$this->postedon = $postedon;
return $this;
}
/**
* Get postedon
*
* #return \DateTime
*/
public function getPostedon()
{
return $this->postedon;
}
}
I think it's your mapping in your entity, you don't use "datetime" doctrine format else your form type will try to generate a date with a string for example but for me "postedOn must always be defined on a new comment.You can update your entity constructor with : $this->setPostedOn(new \Datetime()); or you can use TimestampableTrait

Symfony 2/Doctrine - set value of forgein key

I had a problem like here. I followed the instructions of given solutions, but it generate another problem.
I've got two Entities:
namespace Acme\TyperBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* Mecz
*
* #ORM\Table()
* #ORM\Entity
*/
class Mecz
{
/**
* #var integer
*
* #ORM\Column(name="id", type="integer")
* #ORM\Id
*/
private $id;
/**
* #var string
*
* #ORM\Column(name="druzyna1", type="string", length=255)
*/
private $druzyna1;
/**
* #var string
*
* #ORM\Column(name="druzyna2", type="string", length=255)
*/
private $druzyna2;
/**
* #var int
*
* #ORM\Column(name="bramki1", type="integer")
*/
private $bramki1;
/**
* #var int
*
* #ORM\Column(name="bramki2", type="integer")
*/
private $bramki2;
/**
* #var string
*
* #ORM\Column(name="wyniktyp", type="string", length=2)
*/
private $wyniktyp;
/**
* #var \DateTime
*
* #ORM\Column(name="data", type="datetime")
*/
private $data;
/**
* #var int
*
* #ORM\Column(name="typ1", type="float")
*/
private $typ1;
/**
* #var int
*
* #ORM\Column(name="typ1x", type="float")
*/
private $typ1x;
/**
* #var int
*
* #ORM\Column(name="typ2", type="float")
*/
private $typ2;
/**
* #var int
*
* #ORM\Column(name="typ2x", type="float")
*/
private $typ2x;
/**
* #var int
*
* #ORM\Column(name="typx", type="float")
*/
private $typx;
/**
* #ORM\OneToMany(targetEntity="Typy", mappedBy="meczid")
*/
protected $meczid;
public function __construct()
{
$this->products = new ArrayCollection();
}
/**
* Get id
*
* #return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set druzyna1
*
* #param string $druzyna1
* #return Mecz
*/
public function setDruzyna1($druzyna1)
{
$this->druzyna1 = $druzyna1;
return $this;
}
/**
* Get druzyna1
*
* #return string
*/
public function getDruzyna1()
{
return $this->druzyna1;
}
/**
* Set druzyna2
*
* #param string $druzyna2
* #return Mecz
*/
public function setDruzyna2($druzyna2)
{
$this->druzyna2 = $druzyna2;
return $this;
}
/**
* Get druzyna2
*
* #return string
*/
public function getDruzyna2()
{
return $this->druzyna2;
}
/**
* Set bramki1
*
* #param integer $bramki1
* #return Mecz
*/
public function setBramki1($bramki1)
{
$this->bramki1 = $bramki1;
return $this;
}
/**
* Get bramki1
*
* #return integer
*/
public function getBramki1()
{
return $this->bramki1;
}
/**
* Set bramki2
*
* #param integer $bramki2
* #return Mecz
*/
public function setBramki2($bramki2)
{
$this->bramki2 = $bramki2;
return $this;
}
/**
* Get bramki2
*
* #return integer
*/
public function getBramki2()
{
return $this->bramki2;
}
/**
* Set wyniktyp
*
* #param string $wyniktyp
* #return Mecz
*/
public function setWyniktyp($wyniktyp)
{
$this->wyniktyp = $wyniktyp;
return $this;
}
/**
* Get wyniktyp
*
* #return string
*/
public function getWyniktyp()
{
return $this->wyniktyp;
}
/**
* Set data
*
* #param \DateTime $data
* #return Mecz
*/
public function setData($data)
{
$this->data = $data;
return $this;
}
/**
* Get data
*
* #return \DateTime
*/
public function getData()
{
return $this->data;
}
/**
* Set typ1
*
* #param float $typ1
* #return Mecz
*/
public function setTyp1($typ1)
{
$this->typ1 = $typ1;
return $this;
}
/**
* Get typ1
*
* #return float
*/
public function getTyp1()
{
return $this->typ1;
}
/**
* Set typ2
*
* #param float $typ2
* #return Mecz
*/
public function setTyp2($typ2)
{
$this->typ2 = $typ2;
return $this;
}
/**
* Get typ2
*
* #return float
*/
public function getTyp2()
{
return $this->typ2;
}
/**
* Set typ1x
*
* #param float $typ1x
* #return Mecz
*/
public function setTyp1x($typ1x)
{
$this->typ1x = $typ1x;
return $this;
}
/**
* Get typ1x
*
* #return float
*/
public function getTyp1x()
{
return $this->typ1x;
}
/**
* Set typ2x
*
* #param float $typ2x
* #return Mecz
*/
public function setTyp2x($typ2x)
{
$this->typ2x = $typ2x;
return $this;
}
/**
* Get typ2x
*
* #return float
*/
public function getTyp2x()
{
return $this->typ2x;
}
/**
* Set typx
*
* #param float $typx
* #return Mecz
*/
public function setTypx($typx)
{
$this->typx = $typx;
return $this;
}
/**
* Get typx
*
* #return float
*/
public function getTypx()
{
return $this->typx;
}
/**
* Set id
*
* #param integer $id
* #return Mecz
*/
public function setId($id)
{
$this->id = $id;
return $this;
}
/**
* Add meczid
*
* #param \Acme\TyperBundle\Entity\Typy $meczid
* #return Mecz
*/
public function addMeczid(\Acme\TyperBundle\Entity\Typy $meczid)
{
$this->meczid[] = $meczid;
return $this;
}
/**
* Remove meczid
*
* #param \Acme\TyperBundle\Entity\Typy $meczid
*/
public function removeMeczid(\Acme\TyperBundle\Entity\Typy $meczid)
{
$this->meczid->removeElement($meczid);
}
/**
* Get meczid
*
* #return \Doctrine\Common\Collections\Collection
*/
public function getMeczid()
{
return $this->meczid;
}
/**
* Add mecz
*
* #param \Acme\TyperBundle\Entity\Typy $mecz
* #return Mecz
*/
public function addMecz(\Acme\TyperBundle\Entity\Typy $mecz)
{
$this->mecz[] = $mecz;
return $this;
}
/**
* Remove mecz
*
* #param \Acme\TyperBundle\Entity\Typy $mecz
*/
public function removeMecz(\Acme\TyperBundle\Entity\Typy $mecz)
{
$this->mecz->removeElement($mecz);
}
/**
* Get mecz
*
* #return \Doctrine\Common\Collections\Collection
*/
public function getMecz()
{
return $this->mecz;
}
/**
* Add mecztyp
*
* #param \Acme\TyperBundle\Entity\Typy $mecztyp
* #return Mecz
*/
public function addMecztyp(\Acme\TyperBundle\Entity\Typy $mecztyp)
{
$this->mecztyp[] = $mecztyp;
return $this;
}
/**
* Remove mecztyp
*
* #param \Acme\TyperBundle\Entity\Typy $mecztyp
*/
public function removeMecztyp(\Acme\TyperBundle\Entity\Typy $mecztyp)
{
$this->mecztyp->removeElement($mecztyp);
}
/**
* Get mecztyp
*
* #return \Doctrine\Common\Collections\Collection
*/
public function getMecztyp()
{
return $this->mecztyp;
}
}
and
namespace Acme\TyperBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Typy
*
* #ORM\Table()
* #ORM\Entity
*/
class Typy
{
/**
* #var integer
*
* #ORM\Column(name="id", type="integer")
* #ORM\Id
* #ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* #var integer
*
* #ORM\Column(name="id_kuponu", type="integer")
*/
private $id_kuponu;
/**
* #var integer
*
* #ORM\Column(name="id_meczu", type="integer")
*/
private $id_meczu;
/**
* #var string
*
* #ORM\Column(name="typ", type="string", length=2)
*/
private $typ;
/**
* #var int
*
* #ORM\Column(name="stawka", type="float")
*/
private $stawka;
/**
* #ORM\ManyToOne(targetEntity="Mecz", inversedBy="meczid",cascade={"persist"})
* #ORM\JoinColumn(name="id_meczu", referencedColumnName="id")
*/
private $meczid;
/**
* Get id
*
* #return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set id_kuponu
*
* #param integer $idKuponu
* #return Typy
*/
public function setIdKuponu($idKuponu)
{
$this->id_kuponu = $idKuponu;
return $this;
}
/**
* Get id_kuponu
*
* #return integer
*/
public function getIdKuponu()
{
return $this->id_kuponu;
}
/**
* Set id_meczu
*
* #param integer $idMeczu
* #return Typy
*/
public function setIdMeczu($idMeczu)
{
$this->id_meczu = $idMeczu;
return $this;
}
/**
* Get id_meczu
*
* #return integer
*/
public function getIdMeczu()
{
return $this->id_meczu;
}
/**
* Set typ
*
* #param string $typ
* #return Typy
*/
public function setTyp($typ)
{
$this->typ = $typ;
return $this;
}
/**
* Get typ
*
* #return string
*/
public function getTyp()
{
return $this->typ;
}
/**
* Set meczid
*
* #param \Acme\TyperBundle\Entity\Mecz $meczid
* #return Typy
*/
public function setMeczid(\Acme\TyperBundle\Entity\Mecz $meczid = null)
{
$this->meczid = $meczid;
return $this;
}
/**
* Get meczid
*
* #return \Acme\TyperBundle\Entity\Mecz
*/
public function getMeczid()
{
return $this->meczid;
}
/**
* Set stawka
*
* #param float $stawka
* #return Typy
*/
public function setStawka($stawka)
{
$this->stawka = $stawka;
return $this;
}
/**
* Get stawka
*
* #return float
*/
public function getStawka()
{
return $this->stawka;
}
}
So I want to use this code to insert data to table:
$mecz = new Mecz();
$mecz->setId($id_meczu);
$typs = new Typy();
$et = $this->getDoctrine()->getManager();
$typs->setIdKuponu($id_kuponu);
$typs->setMeczid($mecz);
$typs->setTyp($typ);
$typs->setStawka($stawka);
$et->persist($typs);
$et->flush();
And i get exception:
An exception occurred while executing 'INSERT INTO Mecz (id, druzyna1, druzyna2, bramki1, bramki2, wyniktyp, data, typ1, typ1x, typ2, typ2x, typx) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' with params ["2", null, null, null, null, null, null, null, null, null, null, null]:
I don't know why, because i want to instert data to "Typy" table not "Mecz" table. Can anyone could help me?
The problem is the following:
You have the field Typy::meczid, but this field does (from the perspecitve of Doctrine) not hold a numeric ID, but a reference to a Mecz instance. Therefore the name meczid is misleading, it should be Typy::mecz. I'd recommend renaming the field and the accessors for the sake of consistency.
Now the Typy entity expects a Mecz entity to be set, which you do: You create a new Mecz(), and assign it to Typy with $typs->setMeczid($mecz);. BUT: The Mecz instance is lacking lots all properties except the ID. (By the way, in Doctrine IDs should generally be autogenerated, not by the business logic.) As the Typy entity depends on Mecz, the Mecz must be persisted first, so its reference can be stored with the Typy.
Bottom line: You must fill the generated Mecz with the missing properties.
Hint: To avoid that this type of error happens on the DB level, you should use Symfony's entity validation component. This will allow a much better error handling; both during development, and in production.

Symfony2, doctrine ManyToOne relationships error

I am trying to build a log of some action performed on some site using Symfony2 and Doctrine. I have 2 tables Sites and Logs. The Logs table will contain a siteid which is a foreign key to the id column of sites table. The Logs table can have multiple logs for same site.
When I try to insert an entry in the log table I get siteid is null error.
Here is my code:
Sites Entity:
<?php
namespace A\SHB\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Sites
*
* #ORM\Table()
* #ORM\Entity(repositoryClass="A\SHB\Entity\SitesRepository")
*/
class Sites
{
/**
* #var integer
*
* #ORM\Column(name="id", type="integer")
* #ORM\Id
* #ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* #var ArrayCollection $siteLog
*
* #ORM\OneToMany(targetEntity="Logs", mappedBy="log", cascade={"persist"})
* #ORM\OrderBy({"siteid" = "ASC"})
* #ORM\JoinColumns({
* #ORM\JoinColumn(name="log_id", referencedColumnName="siteid")
* })
*/
private $siteLog;
/**
* Get id
*
* #return integer
*/
public function getId()
{
return $this->id;
}
/**
* Constructor
*/
public function __construct()
{
$this->siteLog = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Add siteLog
*
* #param \A\SHB\Entity\SiteLog $siteLog
* #return Sites
*/
public function addSiteLog(\A\SHB\Entity\SiteLog $siteLog)
{
$this->siteLog[] = $siteLog;
return $this;
}
/**
* Remove siteLog
*
* #param \A\SHB\Entity\SiteLog $siteLog
*/
public function removeSiteLog(\A\SHB\Entity\SiteLog $siteLog)
{
$this->siteLog->removeElement($siteLog);
}
/**
* Get siteLog
*
* #return \Doctrine\Common\Collections\Collection
*/
public function getSiteLog()
{
return $this->siteLog;
}
}
Logs Entity:
<?php
namespace A\SHB\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Logs
*
* #ORM\Table()
* #ORM\Entity(repositoryClass="A\SHB\Entity\LogsRepository")
*/
class Logs
{
/**
* #var integer
*
* #ORM\Column(name="id", type="integer")
* #ORM\Id
* #ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* #var integer
*
* #ORM\Column(name="siteid", type="integer")
*/
private $siteid;
/**
* #var integer
*
* #ORM\Column(name="dateline", type="integer")
*/
private $dateline;
/**
* #var Log
*
* #ORM\ManyToOne(targetEntity="Sites")
* #ORM\JoinColumns({
* #ORM\JoinColumn(name="site_id", referencedColumnName="id")
* })
*/
private $log;
/**
* Get id
*
* #return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set siteid
*
* #param integer $siteid
* #return Logs
*/
public function setSiteid($siteid)
{
$this->siteid = $siteid;
return $this;
}
/**
* Get siteid
*
* #return integer
*/
public function getSiteid()
{
return $this->siteid;
}
/**
* Set dateline
*
* #param integer $dateline
* #return Logs
*/
public function setDateline($dateline)
{
$this->dateline = $dateline;
return $this;
}
/**
* Get dateline
*
* #return integer
*/
public function getDateline()
{
return $this->dateline;
}
/**
* Set log
*
* #param \A\SHB\Entity\Log $log
* #return Logs
*/
public function setLog(\A\SHB\Entity\Log $log = null)
{
$this->log = $log;
return $this;
}
/**
* Get log
*
* #return \A\SHB\Entity\Log
*/
public function getLog()
{
return $this->log;
}
}
Controller :
public function indexAction()
{
$sites = $this->getDoctrine()->getRepository('ASHB:Sites')->findAll();
foreach ($sites as $site)
{
$host = $site->getForum();
// Do something ....
$log = new Logs();
$log->setSiteid($site->getId());
$log->setDateline($temp['dateline']);
$em = $this->getDoctrine()->getManager();
$em->persist($log);
$em->flush();
}
return $this->render('ASHB:Default:index.html.twig', array('sites' => $output, 'counters' => $counters));
}
Now when I run this code, I get the following error:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'siteid' cannot be null"
If I var_dump $log, before $em->persist($log);, the siteid is there. I am not sure what is wrong and why the siteid is getting set to null.
Update 1:
I tried to make the following changes and still get the same error:
/**
* #var Log
*
* #ORM\ManyToOne(targetEntity="Sites", inversedBy="siteLog")
*/
private $log;
OneToMany doesn't need a JoinColumn. So it should look like, according to the documentation.
class Sites
{
/**
* #ORM\OneToMany(targetEntity="Logs", mappedBy="log")
*/
private $site_log;
}
class Logs
{
/**
* #ORM\ManyToOne(targetEntity="Sites", inversedBy="site_log")
* #ORM\JoinColumn(name="site_id", referencedColumnName="id")
*/
private $log;
}
orderBy and cascade were ignored for simplicity.
you have problem in your sturcture,
Remove this from Logs Entity
/**
* #var integer
*
* #ORM\Column(name="siteid", type="integer")
*/
private $siteid;
And then replace this part
/**
* #var Log
*
* #ORM\ManyToOne(targetEntity="Sites")
* #ORM\JoinColumns({
* #ORM\JoinColumn(name="site_id", referencedColumnName="id")
* })
*/
private $log;
with
/**
* #var Log
*
* #ORM\ManyToOne(targetEntity="Sites" inversedBy="logs")
*/
private $site;
And in your sites entity replace this with
/**
* #var ArrayCollection $siteLog
*
* #ORM\OneToMany(targetEntity="Logs", mappedBy="logs", cascade={"persist"})
* #ORM\OrderBy({"siteid" = "ASC"})
* #ORM\JoinColumns({
* #ORM\JoinColumn(name="log_id", referencedColumnName="siteid")
* })
*/
private $logs;
with
/**
* #var ArrayCollection $siteLog
*
* #ORM\OneToMany(targetEntity="Logs", mappedBy="site", cascade={"persist"})
* #ORM\OrderBy({"siteid" = "ASC"})
* #ORM\JoinColumns({
* #ORM\JoinColumn(name="log_id", referencedColumnName="id")
* })
*/
private $logs;
And then use proper setters and getters for these new feilds mean pass object to setter functions, for the class they are being mapped for(if you dont know this part write in comment i will do it as well)

Resources