Api-Platform Foreign key is null on Relation - symfony-3.4

link by a oneToMany and ManyToOne relation. I use normalization and denormalization on entity Commmande, is set correctly because it's working on all field . But the field commande,on PrestationsLaboratoire, use by foreign key is alway null.
I have tried to read many post, but any result.
/**
* #ORM\Entity
* #ApiResource(attributes={
* "normalization_context"={"groups"={"readCO"}},
* "denormalization_context"={"groups"={"writeCO"}}
* })
*
* #ApiFilter(SearchFilter::class, strategy="exact")
*
* #var Commande clients
*/
class Commande {
// les types de commandes
const ROUTINE = "ROUTINE";
const LABORATOIRE = "LABORATOIRE";
const FOURNITURE = "FOURNITURE";
// les status
const IS_ORDERED = "IS_ORDERED";
const IS_VALIDATE = "IS_VALIDATE";
const IN_PROGRESS = "IN_PROGRESS";
const IS_TERMINATED = "IS_TERMINATED";
const IS_CANCELED = "IS_CANCELED";
const ERROR_STATUS = "ERROR_SAISIE_STATUS";
/**
* #var id
* #ORM\Id
* #ORM\Column(type="integer")
* #ORM\GeneratedValue(strategy="AUTO")
* #Groups({"readCO","writeCO"})
*/
protected $id;
/**
* #var le commanditaire de la commande
* #ORM\Column(type="text", length=45)
* #Groups({"readCO","writeCO"})
*/
protected $commanditaire;
/**
* #var date de la commande
* #ORM\Column(type="datetime")
* #Assert\DateTime(format="Y-m-d\TH:i:sP")
* #Groups({"readCO","writeCO"})
*/
protected $date;
/**
*
* #ORM\OneToMany(targetEntity="AppBundle\Entity\PrestationsLaboratoire",mappedBy="commande",cascade={"persist"},fetch="EAGER")
* #Groups({"readCO","writeCO"})
* #MaxDepth(2)
*
*/
protected $prestalabos;
/**
* #var les forunitures
* #ORM\ManyToMany(targetEntity="AppBundle\Entity\Fourniture")
* #Groups({"readCO","writeCO"})
* #MaxDepth(2)
*/
protected $fournitures;
/**
* #var les routines
* #ORM\OneToOne(targetEntity="AppBundle\Entity\Routine", inversedBy="commande", cascade={"persist"},fetch="EAGER")
* #Groups({"readCO","writeCO"})
* #MaxDepth(2)
*/
protected $routine;
/**
* #var status de la commande : IS_ORDERED,IS_VALIDATED,IN_PROGRESS,IS_TERMINATED,IS_CANCELED
* #ORM\Column(type="text", length=15)
* #Groups({"readCO","writeCO"})
*/
protected $status;
/**
* #var ref de la comande pour le client
* #ORM\Column(type="text", length=30)
* #Groups({"readCO","writeCO"})
*/
protected $refClient;
/**
*
* #ORM\ManyToOne(targetEntity="Entreprise",inversedBy="commandes",fetch="EAGER",cascade={"persist"})
* #Groups({"readCO","writeCO"})
*/
protected $entreprise;
public function __construct() {
$this->prestalabos = new ArrayCollection();
$this->fournitures = new ArrayCollection();
}
public function addPrestalabos($presta)
{
$presta->setCommande($this);
$this->prestalabos->add($presta);
}
public function removePrestalabos($presta)
{
$presta->setCommande(null);
$this->prestalabos->removeElement($presta);
}
public function getPrestalabos(){
return $this->prestalabos;
}
public function setPrestalabos($prestationsLaboratoires) {
$this->prestalabos = $prestationsLaboratoires;
}
on field "$prestalabos" oneToMany relation to PrestationsLaboratoire entity on field "$commande"
/**
* #ORM\Entity
* #ApiResource()
* #ApiFilter(SearchFilter::class, strategy="exact")
*/
class PrestationsLaboratoire {
/**
* #var id
* #ORM\Id
* #ORM\Column(type="integer")
* #ORM\GeneratedValue(strategy="AUTO")
* #Groups({"readCO","writeCO"})
*/
public $id;
/**
*#var designation du test : Dosage/Test de stérilité/test endotoxine .....
*#ORM\Column(type="text",nullable=true,length=50)
*#Groups({"readCO","writeCO"})
*/
protected $designation;
/**
* #var origine du dosage :["OBLIGATOIRE","DP","SUPPLEMENTAIRES","LIBRE"]
* - DP(deviation paramétrique)
* - OBLIGATOIRE définit dans le rapport de sté
* - TRAITEMENT définit dans le rapport de traitement
* - SUPPLEMENTAIRES demande complémentaire du client
* - LIBRE commande client non liée steriservice
* #ORM\Column(type="text",length=15)
* #Groups({"readCO","writeCO"})
*
*/
protected $origine;
/**
* #var méthode uniquement pour le Dosage : Simulation ou Extraction
* #ORM\Column(type="text",nullable=true,length=45)
* #Groups({"readCO","writeCO"})
*/
protected $methode;
/**
*#var ref du rapport de la methode
*#ORM\Column(type="text",nullable=true,length=45)
*#Groups({"readCO","writeCO"})
*/
protected $rapportValidationMethode;
/**
* #var ref to sterilisation
* ORM\ManyToOne(targetEntity="Sterilisation",inversedBy="dosages",fetch="EAGER",cascade={"persist"})
* Groups({"readCO","writeCO"})
*/
protected $sterilisation ;
/**
* #var ref to traitement
* ORM\ManyToOne(targetEntity="Traitement",inversedBy="dosages",fetch="EAGER",cascade={"persist"})
*Groups({"readCO","writeCO"})
*/
protected $traitement ;
/**
* #var ref dosages obligatoires rapportSterilisation
* #ORM\ManyToOne(targetEntity="RapportSterilisation",inversedBy="dosages",fetch="EAGER",cascade={"persist"})
*#Groups({"readCO","writeCO"})
*/
protected $rapportSterilisation;
/**
* ref dosages obligatoires rapportTraitement
* #ORM\ManyToOne(targetEntity="RapportTraitement",inversedBy="dosages",fetch="EAGER",cascade={"persist"})
* #Groups({"readCO","writeCO"})
*/
protected $rapportTraitement;
/**
*#var reference du produit
*#ORM\Column(type="text",nullable=true,length=50)
*#Groups({"readCO","writeCO"})
*/
protected $ref;
/**
*#var num des lots concernés
*#ORM\Column(type="text",nullable=true,length=200)
*#Groups({"readCO","writeCO"})
*/
protected $numLots;
/**
*#var commantaires sur les tests
*#ORM\Column(type="text",nullable=true,length=200)
*#Groups({"readCO","writeCO"})
*
*/
protected $commentaire;
/**
* la commande reliée
* #ORM\ManyToOne(targetEntity="AppBundle\Entity \Commande",inversedBy="prestalabos",fetch="EAGER",cascade={"persist"})
* #Groups({"readCO","writeCO"})
*
*/
protected $commande;
My foreign key (commande_id) on PrestationsLaboratoire table is alway null, i don't understand why? I'm stuck since few hours with this issue. The result on postman is :
{
"#context": "/app_dev.php/api/contexts/Commande",
"#id": "/app_dev.php/api/commandes/55",
"#type": "Commande",
"id": 55,
"commanditaire": "bruno.rotrou#free.fr",
"date": "2018-10-15T20:23:45+02:00",
"prestalabos": [
{
"#id": "/app_dev.php/api/prestations_laboratoires/16",
"#type": "PrestationsLaboratoire",
"id": 16,
"designation": "test bruno",
"origine": "supplmentaire",
"methode": null,
"rapportValidationMethode": "ref-4588",
"rapportSterilisation": null,
"rapportTraitement": null,
"ref": null,
"numLots": "125,455,478",
"commentaire": "les tes sont dans l'aquarium",
"commande": null
}
],
"fournitures": [],
"routine": null,
"status": "IS_ORDERED",
"refClient": "ma commande",
"entreprise": "/app_dev.php/api/entreprises/2334"
}
Thanks

i have found the mistake.
for doctrine arrayCollection the add methode must de like this without "s" at the method end.
public function addPrestalabo($presta)
bad was
public function addPrestalabos($presta)
Note the "s" is in minus.
i don't know how symfony is handling method like addMyProperty ???? i have tried to search explanation but the cause stay open.

Related

Transform SQL to DQL

I tried to transform a SQL function into DQL but i always have errors...
I have 3 tables
/**
* #ORM\Entity(repositoryClass=ArticleRepository::class)
*/
class Article
{
/**
* #ORM\Id
* #ORM\GeneratedValue
* #ORM\Column(type="integer")
*/
private $id;
/**
* #ORM\Column(type="string", length=255)
*/
private $title;
/**
* #Gedmo\Slug(fields={"title"})
* #ORM\Column(type="string", length=255, unique=true, nullable=true)
*/
private $slug;
/**
* #ORM\Column(type="boolean", options={"default":"0"})
*/
private $isItalian = false;
/**
* #ORM\Column(type="text")
*/
private $content;
/**
* #ORM\ManyToMany(targetEntity=Contact::class, inversedBy="viewedArticles")
*/
private $contact;
}
class Contact implements UserInterface, JsonSerializable
{
/**
* #ORM\Id
* #ORM\GeneratedValue
* #ORM\Column(type="integer")
*/
protected ?int $id = null;
/**
* #ORM\Column(type="string", length=255, unique=true)
*/
protected ?string $email = null;
/**
* #ORM\ManyToMany(targetEntity=Article::class, mappedBy="contact")
*/
private $viewedArticles;
}
And a many to many table
article_contact (a manyToMany table) with article_id and contact_id
i want to get all articles who are not in the article_contact table (it's all the articles who're not viewed by the contact)
I tried this request in SQL and it works, but it return an array and i need to return an object to use it in Symfony
$conn = $entityManager->getConnection();
$sql = 'SELECT *
FROM article
LEFT JOIN article_contact
ON article.id = article_id
AND contact_id = '.$id.'
WHERE article.is_italian = '.$isItalian.'
AND article_id IS NULL';
$stmt = $conn->prepare($sql);
$result = $stmt->executeQuery();
return $result->fetchAllAssociative();
DQL request :
return $this->createQueryBuilder('a')
->leftJoin('a.contact', 'contact')
->where('a.isItalian = 0')
->andWhere('contact = 1')
->andWhere('contact.viewedArticles IS NULL')
->getQuery()
->getResult()
;
it's the ->andWhere('contact.viewedArticles IS NULL') part who's not working, i have this error
[Semantical Error] line 0, col 113 near 'viewedArticles': Error: Invalid PathExpression. StateFieldPathExpression or SingleValuedAssociationField expected.
The answer is
$qb->select('a')
->from(Article::class,'a')
->leftJoin('a.contact', 'contact', 'WITH', 'contact.id = :id')
->setParameter('id', $contactId)
->andWhere('a.isItalian = :isItalian')
->setParameter('isItalian', $isItalian)
->groupBy('a.id')
->having('COUNT(contact.id) = 0')
;
return $qb->getQuery()->getResult();
Thanks to Will B. !

ORM ManyToOne Unidirectional fetchAll Object array does not render in phtml Zend Framework 3

The application has built in ZF3. I have to entity with ManyToOne relationship using ORM. The issue is when i render through controller and and if fetch data via index it gives okay result but when i assign that to view and trying to render at phtml it throws an error/
/**
* Subscriptions
*
* #ORM\Table(name="subscriptions", indexes={#ORM\Index(name="CUST_ID", columns={"customer_id"}),#ORM\Index(name="SUB_TYPE_ID", columns={"subscription_type_id"})})
* #ORM\Entity
*/
class Subscriptions
{
/**
* #var integer
*
* #ORM\Column(name="id", type="integer", nullable=false)
* #ORM\Id
* #ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* #var \Application\Entity\SubscriptionType
*
* #ORM\ManyToOne(targetEntity="Application\Entity\SubscriptionType")
* #ORM\JoinColumns({
* #ORM\JoinColumn(name="subscription_type_id", referencedColumnName="id")
* })
*/
protected $subscriptionType;
//set
public function setSubscriptionType(\Application\Entity\SubscriptionType $subscriptionType = null)
{
$this->subscriptionType = $subscriptionType;
return $this;
}
//get
public function getSubscriptionType(){
return $this->subscriptionType;
}
//other setter and getter....
}
Another Class
/**
* SubscriptionType
*
* #ORM\Table(name="subscription_type")
* #ORM\Entity
*/
class SubscriptionType
{
/**
* #var integer
*
* #ORM\Column(name="id", type="integer", nullable=false)
* #ORM\Id
* #ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* #var string
*
* #ORM\Column(name="description", type="text", length=65535, nullable=true)
*/
private $description;
/**
* Get id
*enter code here
* #return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set description
*
* #param string $description
*
* #return SubscriptionType
*/
public function setDescription($description)
{
$this->description = $description;
return $this;
}
}
Now at controller i have wrote...
//some initiations
class AdminController extends AbstractActionController
{
//other initiations including __construct....
public function usersubscriptionsAction(){
$this->subscriptions = $this->entityManager->getRepository(Subscriptions::class)->findAll();
/*
foreach($this->subscriptions as $subscription){
//if i am checking with this it gives proper output
echo $subscription->getSubscriptionType()->getDescription();
die();
}
*/
return new ViewModel(
array(
"subscriptions" => $this->subscriptions
)
);
}
}
///i have phtml file
<?php foreach ($subscriptions as $subscription): ?>
//below line throwing an error
<?php echo $subscription->getSubscriptionType()->getDescription(); ?>
<?php endforeach; ?>
when i run it throw an erro message
Call to a member function getDescription() on null
You've got the relation mapping incorrect. Corrected the property annotation below:
/**
* #var \Application\Entity\SubscriptionType
*
* #ORM\ManyToOne(targetEntity="Application\Entity\SubscriptionType")
* #ORM\JoinColumn(name="subscription_type_id", referencedColumnName="id")
*/
protected $subscriptionType;
You had
/**
* #var \Application\Entity\SubscriptionType
*
* #ORM\ManyToOne(targetEntity="Application\Entity\SubscriptionType")
* #ORM\JoinColumns({
* #ORM\JoinColumn(name="subscription_type_id", referencedColumnName="id")
* })
*/
protected $subscriptionType;
The #ORM\JoinColumns is used for when you have a join with multiple columns, please see the docs. Though, the most common usage of JoinColumns is for a JoinTable.

Symfony, Invalid data (AppBundle\Entity\InterventionType), expected "AppBundle\Entity\Intervention

I'm trying to insert a line to my base, from postman to a local api with some foreign keys and I have this bug :
"message": "Invalid data \"1\"(AppBundle\Entity\InterventionType),
expected \"AppBundle\Entity\Intervention\"."
It pointed to the bad Entity and I don't know why. I'm targeting "Intervention", and doctrine seems to go in InterventionType...
Here's my entity :
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use \DateTime;
/**
* InterventionRapport
*
* #ORM\Table(name="intervention_rapport", options={"comment":"Table répertoriant les retours associés aux différentes interventions (commerciales et techniques) - Egalement utilisée pour rémunérer les techniciens et calculer les frais kilométriques tech/com"})
* #ORM\Entity
*/
class InterventionRapport
{
/**
* #var integer
* #ORM\OneToOne(targetEntity="AppBundle\Entity\Intervention")
* #ORM\JoinColumn(name="intervention", nullable=false)
*/
private $intervention;
/**
* #var string
*
* #ORM\Column(name="message", type="text", nullable=true)
*/
private $message;
/**
* #var integer
*
* #ORM\Column(name="statut", type="integer", nullable=false)
*/
private $statut = '0';
/**
* some other things
**/
/**
* #var integer
*
* #ORM\Column(name="id", type="integer")
* #ORM\Id
* #ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
}
and the entity targeted with foreign key:
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Intervention
*
* #ORM\Table(name="intervention")
* #ORM\Entity
*/
class Intervention
{
/**
* #var integer
*
* #ORM\ManyToOne(targetEntity="AppBundle\Entity\InterventionType")
* #ORM\JoinColumn(name="type", nullable=false)
*/
private $type;
/**
* Some other things
**/
/**
* #var integer
*
* #ORM\Column(name="id", type="integer")
* #ORM\Id
* #ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
}
And finally my json:
{
"message": "Steuh plait !",
"statut": 1,
"datemaintenanceprevue": "2017-08-23T15:00:00+00:00",
"heuresintervention": 1,
"heurestrajet": 0.5,
"kmtrajet": 27,
"deleted": 0,
"intervention": 1,
"id": 2
}
Please help, what am I doing wrong?
I found a slution by changing the way I created the line. I don't put the intervention id directly, I pass it into the url :
class RapportController extends Controller
{
/**
* #Rest\Post(
* path = "/reports/intervention={id}",
* name = "app_report_create"
* )
* #Rest\View(StatusCode = 201)
* #ParamConverter("report", converter="fos_rest.request_body")
*/
public function createAction(Request $request, InterventionRapport $report)
{
$em = $this->getDoctrine()->getManager();
$intervention = $this->get('doctrine.orm.entity_manager')
->getRepository('AppBundle:Intervention')
->find($request->get('id'));
//$report = new \DateTime($datemaintenanceprevue);
$report->setIntervention($intervention);
$em->persist($report);
$em->flush();
return $report;
}
So, I don't need to post the intervention id from my client' json :
{
"message": "Steuh plait !",
"statut": 1,
"datemaintenanceprevue": "2017-08-23T15:00:00+00:00",
"heuresintervention": 1,
"heurestrajet": 0.5,
"kmtrajet": 27,
"deleted": 0,
"id": 2
}
I don't know if it's the correct way to do it, but it solved the problem. Hope it can help someone else.

Catchable Fatal Error: Object of class AppBundle\Entity\Users could not be converted to string

I am new to symfony and doctrine. I have 2 entities in doctrine one is Users and other is ActivityLogs here is the classes.
Users.php
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Users
*
* #ORM\Table(name="ms_users")
* #ORM\Entity
*/
class Users
{
/**
* #var integer
*
* #ORM\Column(name="id", type="integer")
* #ORM\Id
* #ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* #var string
*
* #ORM\Column(name="username", type="string", length=50)
*/
private $username;
/**
* #var string
*
* #ORM\Column(name="verification_tokken", type="string", length=100)
*/
private $verificationTokken;
/**
* #var string
*
* #ORM\Column(name="tokken_expiry_time", type="string", length=50)
*/
private $tokkenExpiryTime;
/**
* #var integer
*
* #ORM\Column(name="is_two_way_auth_enabled", type="boolean")
*/
private $isTwoWayAuthEnabled;
/**
* #var string
*
* #ORM\Column(name="verification_pin", type="string", length=50)
*/
private $verificationPin;
/**
* #var string
*
* #ORM\Column(name="slug", type="string", length=250)
*/
private $slug;
/**
* #var string
*
* #ORM\Column(name="date_string", type="string", length=50)
*/
private $dateString;
/**
* #var string
*
* #ORM\Column(name="date_time_string", type="string", length=50)
*/
private $dateTimeString;
/**
* #var integer
*
* #ORM\Column(name="is_active", type="integer")
*/
private $isActive;
/**
* #var integer
*
* #ORM\Column(name="is_deleted", type="integer")
*/
private $isDeleted;
/**
* #var integer
*
* #ORM\Column(name="is_editable", type="integer")
*/
private $isEditable;
/**
* #var string
*
* #ORM\Column(name="last_updated_on", type="string", length=50)
*/
private $lastUpdatedOn;
/**
* #var integer
*
* #ORM\Column(name="school_id", type="integer")
*/
private $schoolId;
/**
* #var integer
*
* #ORM\Column(name="updated_by", type="integer")
*/
private $updatedBy;
/**
* Get id
*
* #return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set username
*
* #param string $username
*
* #return Users
*/
public function setUsername($username)
{
$this->username = $username;
return $this;
}
/**
* Get username
*
* #return string
*/
public function getUsername()
{
return $this->username;
}
/**
* Set verificationTokken
*
* #param string $verificationTokken
*
* #return Users
*/
public function setVerificationTokken($verificationTokken)
{
$this->verificationTokken = $verificationTokken;
return $this;
}
/**
* Get verificationTokken
*
* #return string
*/
public function getVerificationTokken()
{
return $this->verificationTokken;
}
/**
* Set tokkenExpiryTime
*
* #param string $tokkenExpiryTime
*
* #return Users
*/
public function setTokkenExpiryTime($tokkenExpiryTime)
{
$this->tokkenExpiryTime = $tokkenExpiryTime;
return $this;
}
/**
* Get tokkenExpiryTime
*
* #return string
*/
public function getTokkenExpiryTime()
{
return $this->tokkenExpiryTime;
}
/**
* Set isTwoWayAuthEnabled
*
* #param integer $isTwoWayAuthEnabled
*
* #return Users
*/
public function setIsTwoWayAuthEnabled($isTwoWayAuthEnabled)
{
$this->isTwoWayAuthEnabled = $isTwoWayAuthEnabled;
return $this;
}
/**
* Get isTwoWayAuthEnabled
*
* #return integer
*/
public function getIsTwoWayAuthEnabled()
{
return $this->isTwoWayAuthEnabled;
}
/**
* Set verificationPin
*
* #param string $verificationPin
*
* #return Users
*/
public function setVerificationPin($verificationPin)
{
$this->verificationPin = $verificationPin;
return $this;
}
/**
* Get verificationPin
*
* #return string
*/
public function getVerificationPin()
{
return $this->verificationPin;
}
/**
* Set slug
*
* #param string $slug
*
* #return Users
*/
public function setSlug($slug)
{
$this->slug = $slug;
return $this;
}
/**
* Get slug
*
* #return string
*/
public function getSlug()
{
return $this->slug;
}
/**
* Set dateString
*
* #param string $dateString
*
* #return Users
*/
public function setDateString($dateString)
{
$this->dateString = $dateString;
return $this;
}
/**
* Get dateString
*
* #return string
*/
public function getDateString()
{
return $this->dateString;
}
/**
* Set dateTimeString
*
* #param string $dateTimeString
*
* #return Users
*/
public function setDateTimeString($dateTimeString)
{
$this->dateTimeString = $dateTimeString;
return $this;
}
/**
* Get dateTimeString
*
* #return string
*/
public function getDateTimeString()
{
return $this->dateTimeString;
}
/**
* Set isActive
*
* #param integer $isActive
*
* #return Users
*/
public function setIsActive($isActive)
{
$this->isActive = $isActive;
return $this;
}
/**
* Get isActive
*
* #return integer
*/
public function getIsActive()
{
return $this->isActive;
}
/**
* Set isDeleted
*
* #param integer $isDeleted
*
* #return Users
*/
public function setIsDeleted($isDeleted)
{
$this->isDeleted = $isDeleted;
return $this;
}
/**
* Get isDeleted
*
* #return integer
*/
public function getIsDeleted()
{
return $this->isDeleted;
}
/**
* Set isEditable
*
* #param integer $isEditable
*
* #return Users
*/
public function setIsEditable($isEditable)
{
$this->isEditable = $isEditable;
return $this;
}
/**
* Get isEditable
*
* #return integer
*/
public function getIsEditable()
{
return $this->isEditable;
}
/**
* Set lastUpdatedOn
*
* #param string $lastUpdatedOn
*
* #return Users
*/
public function setLastUpdatedOn($lastUpdatedOn)
{
$this->lastUpdatedOn = $lastUpdatedOn;
return $this;
}
/**
* Get lastUpdatedOn
*
* #return string
*/
public function getLastUpdatedOn()
{
return $this->lastUpdatedOn;
}
/**
* Set schoolId
*
* #param integer $schoolId
*
* #return Users
*/
public function setSchoolId($schoolId)
{
$this->schoolId = $schoolId;
return $this;
}
/**
* Get schoolId
*
* #return integer
*/
public function getSchoolId()
{
return $this->schoolId;
}
/**
* Set updatedBy
*
* #param integer $updatedBy
*
* #return Users
*/
public function setUpdatedBy($updatedBy)
{
$this->updatedBy = $updatedBy;
return $this;
}
/**
* Get updatedBy
*
* #return integer
*/
public function getUpdatedBy()
{
return $this->updatedBy;
}
}
AcitivityLogs.php
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* ActivitLogs
*
* #ORM\Table(name="ms_activity_logs")
* #ORM\Entity
*/
class ActivitLogs
{
/**
* #var integer
*
* #ORM\Column(name="id", type="integer")
* #ORM\Id
* #ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* #var integer
*
* #ORM\Column(name="user_id", type="integer")
*
* #ORM\ManyToOne(targetEntity="Users")
* #ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
private $userId;
/**
* #var string
*
* #ORM\Column(name="activity_log", type="text")
*/
private $activityLog;
/**
* #var string
*
* #ORM\Column(name="user_agent", type="string", length=250)
*/
private $userAgent;
/**
* #var string
*
* #ORM\Column(name="os_platform", type="string", length=250)
*/
private $osPlatform;
/**
* #var string
*
* #ORM\Column(name="ip_address", type="string", length=250)
*/
private $ipAddress;
/**
* #var string
*
* #ORM\Column(name="referer", type="text")
*/
private $referer;
/**
* #var string
*
* #ORM\Column(name="date_string", type="string", length=50)
*/
private $dateString;
/**
* #var string
*
* #ORM\Column(name="date_time_string", type="string", length=50)
*/
private $dateTimeString;
/**
* #var integer
*
* #ORM\Column(name="is_active", type="integer")
*/
private $isActive;
/**
* #var integer
*
* #ORM\Column(name="is_deleted", type="integer")
*/
private $isDeleted;
/**
* #var integer
*
* #ORM\Column(name="is_editable", type="integer")
*/
private $isEditable;
/**
* #var string
*
* #ORM\Column(name="last_updated_on", type="string", length=50)
*/
private $lastUpdatedOn;
/**
* #var integer
*
* #ORM\Column(name="school_id", type="integer")
*/
private $schoolId;
/**
* #var integer
*
* #ORM\Column(name="updated_by", type="integer")
*/
private $updatedBy;
/**
* Get id
*
* #return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set userId
*
* #param integer $userId
*
* #return ActivitLogs
*/
public function setUserId($userId)
{
$this->userId = $userId;
return $this;
}
/**
* Get userId
*
* #return integer
*/
public function getUserId()
{
return $this->userId;
}
/**
* Set activityLog
*
* #param string $activityLog
*
* #return ActivitLogs
*/
public function setActivityLog($activityLog)
{
$this->activityLog = $activityLog;
return $this;
}
/**
* Get activityLog
*
* #return string
*/
public function getActivityLog()
{
return $this->activityLog;
}
/**
* Set userAgent
*
* #param string $userAgent
*
* #return ActivitLogs
*/
public function setUserAgent($userAgent)
{
$this->userAgent = $userAgent;
return $this;
}
/**
* Get userAgent
*
* #return string
*/
public function getUserAgent()
{
return $this->userAgent;
}
/**
* Set osPlatform
*
* #param string $osPlatform
*
* #return ActivitLogs
*/
public function setOsPlatform($osPlatform)
{
$this->osPlatform = $osPlatform;
return $this;
}
/**
* Get osPlatform
*
* #return string
*/
public function getOsPlatform()
{
return $this->osPlatform;
}
/**
* Set ipAddress
*
* #param string $ipAddress
*
* #return ActivitLogs
*/
public function setIpAddress($ipAddress)
{
$this->ipAddress = $ipAddress;
return $this;
}
/**
* Get ipAddress
*
* #return string
*/
public function getIpAddress()
{
return $this->ipAddress;
}
/**
* Set referer
*
* #param string $referer
*
* #return ActivitLogs
*/
public function setReferer($referer)
{
$this->referer = $referer;
return $this;
}
/**
* Get referer
*
* #return string
*/
public function getReferer()
{
return $this->referer;
}
/**
* Set dateString
*
* #param string $dateString
*
* #return ActivitLogs
*/
public function setDateString($dateString)
{
$this->dateString = $dateString;
return $this;
}
/**
* Get dateString
*
* #return string
*/
public function getDateString()
{
return $this->dateString;
}
/**
* Set dateTimeString
*
* #param string $dateTimeString
*
* #return ActivitLogs
*/
public function setDateTimeString($dateTimeString)
{
$this->dateTimeString = $dateTimeString;
return $this;
}
/**
* Get dateTimeString
*
* #return string
*/
public function getDateTimeString()
{
return $this->dateTimeString;
}
/**
* Set isActive
*
* #param integer $isActive
*
* #return ActivitLogs
*/
public function setIsActive($isActive)
{
$this->isActive = $isActive;
return $this;
}
/**
* Get isActive
*
* #return integer
*/
public function getIsActive()
{
return $this->isActive;
}
/**
* Set isDeleted
*
* #param integer $isDeleted
*
* #return ActivitLogs
*/
public function setIsDeleted($isDeleted)
{
$this->isDeleted = $isDeleted;
return $this;
}
/**
* Get isDeleted
*
* #return integer
*/
public function getIsDeleted()
{
return $this->isDeleted;
}
/**
* Set isEditable
*
* #param integer $isEditable
*
* #return ActivitLogs
*/
public function setIsEditable($isEditable)
{
$this->isEditable = $isEditable;
return $this;
}
/**
* Get isEditable
*
* #return integer
*/
public function getIsEditable()
{
return $this->isEditable;
}
/**
* Set lastUpdatedOn
*
* #param string $lastUpdatedOn
*
* #return ActivitLogs
*/
public function setLastUpdatedOn($lastUpdatedOn)
{
$this->lastUpdatedOn = $lastUpdatedOn;
return $this;
}
/**
* Get lastUpdatedOn
*
* #return string
*/
public function getLastUpdatedOn()
{
return $this->lastUpdatedOn;
}
/**
* Set schoolId
*
* #param integer $schoolId
*
* #return ActivitLogs
*/
public function setSchoolId($schoolId)
{
$this->schoolId = $schoolId;
return $this;
}
/**
* Get schoolId
*
* #return integer
*/
public function getSchoolId()
{
return $this->schoolId;
}
/**
* Set updatedBy
*
* #param integer $updatedBy
*
* #return ActivitLogs
*/
public function setUpdatedBy($updatedBy)
{
$this->updatedBy = $updatedBy;
return $this;
}
/**
* Get updatedBy
*
* #return integer
*/
public function getUpdatedBy()
{
return $this->updatedBy;
}
}
I have a simple ManyToOne Relationship between these two tables on userId field.
Here is the code with i m trying to add the data in to database with doctrine.
public function checkDatabaseAction(){
$user = new Users();
$user->setDateString(date('Y-m-d'))
->setDateTimeString(date('Y-m-d H:i:s'))
->setIsActive(1)
->setIsDeleted(0)
->setIsEditable(1)
->setIsTwoWayAuthEnabled(0)
->setLastUpdatedOn(date('Y-m-d H:i:s'))
->setSchoolId(1)
->setSlug('abc-123')
->setTokkenExpiryTime(date('Y-m-d'))
->setUpdatedBy(1)
->setUsername('ahmedali5530')
->setVerificationPin('1122')
->setVerificationTokken('hskajdhfkjlh435kh34k5jh435');
$log = new ActivitLogs();
$log->setActivityLog('A log')
->setDateString(date('Y-m-d'))
->setDateTimeString(date('Y-m-d H:i:s'))
->setIpAddress('192.168.1.16')
->setIsActive(1)
->setIsDeleted(0)
->setIsEditable(1)
->setLastUpdatedOn(date('Y-m-d H:i:s'))
->setOsPlatform('Windows 7')
->setReferer('http://localhost/symfony')
->setSchoolId(1)
->setUpdatedBy(1)
->setUserAgent('Chrome')
->setUserId($user);
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->persist($log);
$em->flush();
$allocateCourses = $em->getRepository('AppBundle:AllocateCourses')->findBy(array('isActive'=>1));
return $this->render(':main:form.html.php',array(
'data' => $allocateCourses,
));
}
When I execute this code I received the error:-
An exception occurred while executing 'INSERT INTO ms_activity_logs (user_id, activity_log, user_agent, os_platform, ip_address, referer, date_string, date_time_string, is_active, is_deleted, is_editable, last_updated_on, school_id, updated_by) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' with params [{}, "A log", "Chrome", "Windows 7", "192.168.1.16", "http://localhost/symfony", "2015-12-22", "2015-12-22 16:53:55", 1, 0, 1, "2015-12-22 16:53:55", 1, 1]:
Catchable Fatal Error: Object of class AppBundle\Entity\Users could not be converted to string
Any suggestions how to fix this error.
Ok I got the answer.
I added the new private property in ActivityLogs.php and told Doctrine to generate the entity. Doctrine created getter and setters for that property. This fixed my problem.
Here is the code I added:
/**
* #ORM\ManyToOne(targetEntity="Users", inversedBy="ActivityLogs")
* #ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
private $user;

Doctrine insert table using joined table entities as reference

I have spent the last day trying to find a solution to a problem that I am having and now turn to you to see if you can offer some advice.
Ill start with the table and then the entity
I have three tables,
table_a
table_b
table_c
each table row has a unique id
table_c contains a reference to table_a_id and to table_b_id
This reference should be unidirectional as table_a and table_b have no need to ever know of table_c's existence.
Also, there is no cascading, if an id from table_a or table_b does not exist, then table_c should not be able to insert a row.
ok, now for entities. (I am going to cut out irrelevant code to keep it short)
Entity A defines table_a
/**
* A
* #ORM\Entity(repositoryClass="Sample\Bundle\MyBundle\Entity\ARepository")
* #ORM\Table("table_a")
*/
class A
{
/**
* #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;
/**
* Get id
* #return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set name
* #param string $name
* #return A
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
* #return string
*/
public function getName()
{
return $this->name;
}
}
Entity B defines table_b
/**
* B
*
* #ORM\Table("table_b")
* #ORM\Entity
*/
class B
{
/**
* #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;
/**
* Get id
*
* #return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set name
* #param string $name
* #return B
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
* #return string
*/
public function getName()
{
return $this->name;
}
}
Entity C maps table_c and has many to one relationships with table_a and table_b
/**
* C
*
* #ORM\Table("table_c")
* #ORM\Entity(repositoryClass="Sample\Bundle\MyBundle\Entity\CRepository")
*/
class PricesAverage
{
/**
* #var integer
* #ORM\Column(name="id", type="integer")
* #ORM\Id
* #ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* #var \Sample\Bundle\MyBundle\Entity\A
* #ORM\ManyToOne(targetEntity="Sample\Bundle\MyBundle\Entity\A", inversedBy="id")
* #ORM\JoinColumn(name="a_id",unique=false)
*/
private $a;
/**
* #var \Sample\Bundle\MyBundle\Entity\B
* #ORM\ManyToOne(targetEntity="Sample\Bundle\MyBundle\Entity\B", inversedBy="id")
* #ORM\JoinColumn(name="b_id",unique=false)
*/
private $b;
/**
* Get id
*
* #return integer
*/
public function getId()
{
return $this->id;
}
/**
* #return A
*/
public function getA() {
return $this->a;
}
/**
* #param A $a
* #return $this
*/
public function setA($a) {
$this->a = $a;
return $this;
}
/**
* #return B
*/
public function getB() {
return $this->b;
}
/**
* #param B $b
* #return $this
*/
public function setB($b) {
$this->b = $b;
return $this;
}
}
No what I do is the following. (this is just simplified logic but it is the same process)
$days = 5;
$aCollection = {get collection of A's)
for($i = 0,$i<$days,$i++){
foreach($aCollection as $a){
$b = {get a single b}
$c = new C();
$c->setA($a)
->setB($b);
{use doctrine to persist and flush $c}
}
}
What is happening is that on the first insert the id for a is correct, but on the second insert, doctrine seems to think that competitor is a new entity and tries to persist and create a new id.
I have dumped my collection without activating the doctrine insert and I see that the id on A is correct, I then do the same thing after doctrine and find that doctrine is somehow clearing away my object.
How can I resolve this?
UPDATE:
I resolved this issue.
The problem that I was having is that the related entity was being removed from the entity manager after I did my batch insert.
The was a result of doing clear after every flush.
I moved clear to the end of the process so I flush as much as I need but only clear once.