Symfony2 Cascade on Delete - php

I have two entities:
Warehouses
id | name
---------------------
1 | Warehouse 1
2 | Warehouse 2
Items
id | warehouse_id | name
--------------------------------------
1 | 1 | Item 1
2 | 2 | Item 2
I am wondering how to set the value of warehouse_id to Null if I remove "warehouse 1" from the warehouse table. In all actually I need warehouse_id to be set to NULL on all tables in my db if I remove "warehouse 1".
In my "Items" entity, for example, I have this set up and it does not seem to do anything for me when I remove "warehouse 1"
/**
* #ORM\ManyToOne(targetEntity="WIC\WarehouseBundle\Entity\Warehouse", inversedBy="purchaseOrderLineItemLocation")
* #ORM\JoinColumn(name="warehouse_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
* #Common\Versioned
*/
protected $warehouse;
Here is my full warehouse entity
Is there something in here that I need to set?
/**
* #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)
* #Common\Versioned
* #Assert\NotBlank(message="Location Name cannot be blank.")
*/
private $name;
/**
* #var string $description
*
* #Common\Versioned
* #ORM\Column(name="description", type="text")
*/
protected $description;
/**
* #var string
* #ORM\Column(name="address", type="string", length=255)
* #Common\Versioned
* #Assert\NotBlank(message="Address cannot be blank.")
*/
private $address;
/**
* #var string
* #ORM\Column(name="address2", type="string", length=255, nullable=true)
* #Common\Versioned
*/
private $address2;
/**
* #var string
* #ORM\Column(name="city", type="string", length=255)
* #Common\Versioned
* #Assert\NotBlank(message="City cannot be blank.")
*/
private $city;
/**
* #var string
* #ORM\Column(name="state", type="string", length=255)
* #Common\Versioned
* #Assert\NotBlank(message="State cannot be blank.")
*/
private $state;
/**
* #var string
* #ORM\Column(name="zip", type="string", length=255)
* #Gedmo\Versioned
* #Assert\NotBlank(message="Zip cannot be blank.")
*/
private $zip;
/**
* #var string
* #ORM\Column(name="country", type="string", length=255, nullable=true)
* #Common\Versioned
*/
private $country;
/**
* #var string
* #ORM\Column(name="phone", type="string", length=255, nullable=true)
* #Common\Versioned
*/
private $phone;
/**
* #var string
* #ORM\Column(name="email", type="string", length=255, nullable=true)
* #Common\Versioned
*/
private $email;
/**
* #var string
* #ORM\Column(name="fax", type="string", length=255, nullable=true)
* #Common\Versioned
*/
private $fax;
/**
* #ORM\OneToMany(targetEntity="WIC\InventoryLocationBundle\Entity\InventoryLocation", mappedBy="inventoryLocation")
*/
protected $inventoryLocations;
/**
* #ORM\ManyToOne(targetEntity="WIC\UserBundle\Entity\User")
* #ORM\JoinColumn(name="created_by", referencedColumnName="id")
* #Common\Blameable(on="create")
*/
private $createdBy;
/**
* #ORM\ManyToOne(targetEntity="WIC\UserBundle\Entity\User")
* #ORM\JoinColumn(name="updated_by", referencedColumnName="id")
* #Common\Blameable(on="update")
*/
private $updatedBy;
/**
* #ORM\ManyToOne(targetEntity="WIC\AccountBundle\Entity\Account", inversedBy="warehouses")
* #ORM\JoinColumn(name="account_id", referencedColumnName="id", nullable=false)
* #Common\Versioned
* #Common\Blameable(on="create")
*/
protected $account;
/**
* #var datetime $created
*
* #Common\Timestampable(on="create")
* #ORM\Column(type="datetime")
*/
private $created;
/**
* #var datetime $updated
*
* #Common\Timestampable(on="update")
* #ORM\Column(type="datetime", nullable=true)
*/
private $updated;
/**
* #ORM\Column(name="deletedAt", type="datetime", nullable=true)
*/
private $deletedAt;
public function __construct()
{
$this->inventoryLocations = new ArrayCollection();
}

You are probably better of keeping it as restrict on delete, then use a doctrine event subscriber to set the reference to null.
http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html
This would give you more control over the process, as well as keeping you aware of what your application is doing. Try not to let the framework act on its own when it comes to destruction of data, otherwise you will start creating holes in your application that become difficult to diagnose.

Related

Null value not allowed while updating Database schema

i have an entity called "FosUser" :
<?php
namespace techeventBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* FosUser
*
* #ORM\Table(name="fos_user", uniqueConstraints={#ORM\UniqueConstraint(name="UNIQ_957A6479A0D96FBF", columns={"email_canonical"}), #ORM\UniqueConstraint(name="UNIQ_957A647992FC23A8", columns={"username_canonical"}), #ORM\UniqueConstraint(name="UNIQ_957A6479C05FB297", columns={"confirmation_token"})}, indexes={#ORM\Index(name="IDX_957A647914013572", columns={"copon_id"})})
* #ORM\Entity
*/
class FosUser
{
/**
* #var integer
*
* #ORM\Column(name="id", type="integer", nullable=false)
* #ORM\Id
* #ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* #var string
*
* #ORM\Column(name="username", type="string", length=180, nullable=true)
*/
private $username;
/**
* #var string
*
* #ORM\Column(name="username_canonical", type="string", length=180, nullable=true)
*/
private $usernameCanonical;
/**
* #var string
*
* #ORM\Column(name="email", type="string", length=180, nullable=false)
*/
private $email;
/**
* #var string
*
* #ORM\Column(name="email_canonical", type="string", length=180, nullable=true)
*/
private $emailCanonical;
/**
* #var boolean
*
* #ORM\Column(name="enabled", type="boolean", nullable=true)
*/
private $enabled;
/**
* #var string
*
* #ORM\Column(name="salt", type="string", length=255, nullable=true)
*/
private $salt;
/**
* #var string
*
* #ORM\Column(name="password", type="string", length=255, nullable=false)
*/
private $password;
/**
* #var \DateTime
*
* #ORM\Column(name="last_login", type="datetime", nullable=true)
*/
private $lastLogin;
/**
* #var string
*
* #ORM\Column(name="confirmation_token", type="string", length=180, nullable=true)
*/
private $confirmationToken;
/**
* #var \DateTime
*
* #ORM\Column(name="password_requested_at", type="datetime", nullable=true)
*/
private $passwordRequestedAt;
/**
* #var array
*
* #ORM\Column(name="roles", type="array", nullable=true)
*/
private $roles;
/**
* #var string
*
* #ORM\Column(name="nom", type="string", length=255, nullable=false)
*/
private $nom;
/**
* #var string
*
* #ORM\Column(name="prenom", type="string", length=255, nullable=false)
*/
private $prenom;
/**
* #var string
*
* #ORM\Column(name="tel", type="string", length=30, nullable=true)
*/
private $tel;
/**
* #var integer
*
* #ORM\Column(name="age", type="integer", nullable=false)
*/
private $age;
/**
* #var string
*
* #ORM\Column(name="sexe", type="string", length=255, nullable=true)
*/
private $sexe;
/**
* #var string
*
* #ORM\Column(name="fonction", type="string", length=255, nullable=true)
*/
private $fonction;
/**
* #var string
*
* #ORM\Column(name="address", type="string", length=255, nullable=true)
*/
private $address;
/**
* #var string
*
* #ORM\Column(name="categorie", type="string", length=255, nullable=true)
*/
private $categorie;
/**
* #var string
*
* #ORM\Column(name="type", type="string", length=255, nullable=true)
*/
private $type;
/**
* #var string
*
* #ORM\Column(name="description", type="string", length=255, nullable=true)
*/
private $description;
/**
* #var string
*
* #ORM\Column(name="role", type="string", length=255, nullable=true)
*/
private $role;
/**
* #var \Coupon
*
* #ORM\ManyToOne(targetEntity="Coupon")
* #ORM\JoinColumns({
* #ORM\JoinColumn(name="copon_id", referencedColumnName="id")
* })
*/
private $copon;
}
i have deleted fields in this entity and changed the default value of fields to null ('nullable = true') like this :
<?php
namespace AppBundle\Entity;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
/**
* FosUser
*
* #ORM\Table(name="fos_user", uniqueConstraints={#ORM\UniqueConstraint(name="UNIQ_957A6479A0D96FBF", columns={"email_canonical"}), #ORM\UniqueConstraint(name="UNIQ_957A647992FC23A8", columns={"username_canonical"}), #ORM\UniqueConstraint(name="UNIQ_957A6479C05FB297", columns={"confirmation_token"})}, indexes={#ORM\Index(name="IDX_957A647914013572", columns={"copon_id"})})
* #ORM\Entity
*/
class FosUser extends BaseUser
{
/**
* #var integer
*
* #ORM\Column(name="id", type="integer", nullable=false)
* #ORM\Id
* #ORM\GeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
* #var string
*
* #ORM\Column(name="nom", type="string", length=255, nullable=true)
*/
protected $nom;
/**
* #var string
*
* #ORM\Column(name="prenom", type="string", length=255, nullable=true)
*/
protected $prenom;
/**
* #var string
*
* #ORM\Column(name="tel", type="string", length=30, nullable=true)
*/
protected $tel;
/**
* #var integer
*
* #ORM\Column(name="age", type="integer", nullable=false)
*/
protected $age;
/**
* #var string
*
* #ORM\Column(name="sexe", type="string", length=255, nullable=true)
*/
protected $sexe;
/**
* #var string
*
* #ORM\Column(name="fonction", type="string", length=255, nullable=true)
*/
protected $fonction;
/**
* #var string
*
* #ORM\Column(name="address", type="string", length=255, nullable=true)
*/
protected $address;
/**
* #var string
*
* #ORM\Column(name="categorie", type="string", length=255, nullable=true)
*/
protected $categorie;
/**
* #var string
*
* #ORM\Column(name="type", type="string", length=255, nullable=true)
*/
protected $type;
/**
* #var string
*
* #ORM\Column(name="description", type="string", length=255, nullable=true)
*/
protected $description;
/**
* #var string
*
* #ORM\Column(name="role", type="string", length=255, nullable=true)
*/
protected $role;
/**
* #var \Coupon
*
* #ORM\ManyToOne(targetEntity="Coupon")
* #ORM\JoinColumns({
* #ORM\JoinColumn(name="copon_id", referencedColumnName="id")
* })
*/
protected $copon;
public function __construct()
{
parent::__construct();
// your own logic
}
}
i had those errors after updating the database schema :
In AbstractMySQLDriver.php line 112:
An exception occurred while executing 'ALTER TABLE fos_user CHANGE
username username VARCHAR(180) NOT NULL, CHANGE username_canonical
username_canonic al VARCHAR(180) NOT NULL, CHANGE email_canonical
email_canonical VARCHAR(18 0) NOT NULL, CHANGE enabled enabled
TINYINT(1) NOT NULL, CHANGE roles roles LONGTEXT NOT NULL COMMENT
'(DC2Type:array)', CHANGE nom nom VARCHAR(255) D EFAULT NULL, CHANGE
prenom prenom VARCHAR(255) DEFAULT NULL':
SQLSTATE[22004]: Null value not allowed: 1138 Utilisation incorrecte
de la valeur NULL
In PDOConnection.php line 106:
SQLSTATE[22004]: Null value not allowed: 1138 Utilisation incorrecte
de la valeur NULL
In PDOConnection.php line 104:
SQLSTATE[22004]: Null value not allowed: 1138 Utilisation incorrecte
de la valeur NULL
Your code is right!
Previously you haven't used FOUser class, your fos_user table have already username, emailCanonical, etc ...
Then when you extend FOSUser and update database schema, your current entity doesn't accept null value for username, etc .. (It's FOSUser logic)
Solution, you have to delete your fos_user table before updating the database schema

Symfony 3 and EasyAdminBundle: Form's text field don't work properly

I'm going to working in a Admin Backend to a WebPage with Symfony 2.2.8 and Javier Eguiluz's EasyAdminBundle 1.16.12 (last version). I installed the bundle following the instructions in GitHub page, and I have also created a couple of test entities (Users and Engagementes).
Well, my trouble is that the text type in the edit template not working, they are empty and without label, otherwise the entity can be edited correctly.
User:
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* User
*
* #ORM\Table(name="User")
* #ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
*/
class User
{
/**
* #var int
*
* #ORM\Column(name="id", type="integer")
* #ORM\Id
* #ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* #var string
*
* #ORM\Column(name="name", type="string", length=50, nullable=true)
*/
private $name;
/**
* #var string
*
* #ORM\Column(name="surname", type="string", length=255, nullable=true)
*/
private $surname;
/**
* #var string
*
* #ORM\Column(name="username", type="string", length=50, unique=true)
*/
private $username;
/**
* #var string
*
* #ORM\Column(name="email", type="string", length=255, unique=true)
*/
private $email;
/**
* #var string
*
* #ORM\Column(name="password", type="string", length=255)
*/
private $password;
/**
* #var string
*
* #ORM\Column(name="role", type="string", length=50)
*/
private $role;
// getter and setter [...]
Engagement:
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Engagement
*
* #ORM\Table(name="Engagement")
* #ORM\Entity(repositoryClass="AppBundle\Repository\EngagementRepository")
*/
class Engagement
{
/**
* #var int
*
* #ORM\Column(name="id", type="integer")
* #ORM\Id
* #ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* #var string
*
* #ORM\Column(name="code", type="string", length=20, unique=true)
*/
private $code;
/**
* #var string
*
* #ORM\Column(name="owner", type="string", length=255)
*/
private $owner;
/**
* #var int
*
* #ORM\Column(name="phone", type="integer", nullable=true)
*/
private $phone;
/**
* #var string
*
* #ORM\Column(name="incident", type="string", length=255)
*/
private $incident;
/**
* #var string
*
* #ORM\Column(name="brand", type="string", length=50, nullable=true)
*/
private $brand;
/**
* #var string
*
* #ORM\Column(name="model", type="string", length=255, nullable=true)
*/
private $model;
/**
* #var string
*
* #ORM\Column(name="repairer", type="string", length=255, nullable=true)
*/
private $repairer;
/**
* #var float
*
* #ORM\Column(name="cost", type="float", nullable=true)
*/
private $cost;
/**
* #var float
*
* #ORM\Column(name="advance", type="float", nullable=true)
*/
private $advance;
/**
* #var \DateTime
*
* #ORM\Column(name="start_date", type="datetime")
*/
private $startDate;
/**
* #var string
*
* #ORM\Column(name="status", type="string", length=50)
*/
private $status;
/**
* #var string
*
* #ORM\Column(name="comment", type="string", length=255, nullable=true)
*/
private $comment;
// setters and getters [...]
Config.yml:
# [...]
easy_admin:
entities:
- AppBundle\Entity\User
- AppBundle\Entity\Engagement
And I get it with EasyAdminBundle:
P.S.: I'm sorry if I made mistakes, English is not my native language.

Optional ManyToOne relationship in Doctrine 2

I'm building an application for SNMP Trap logging. It has two MySQL tables: one with the traps, and one with the hosts that I want to log.
The traps table is filled externally. The hosts can be entered through the website. A host CAN have one or many traps. A trap CAN have one host.
So this is a many to one relationship, but optional on both sides. How do I implement this, since Doctrine requires for one of the members to be a primary key, and therefore not nullable?
Code for both classes:
class Trap
{
/**
* #var integer
*
* #ORM\Column(name="id", type="integer")
* #ORM\Id
* #ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* #var string
*
* #ORM\Column(name="eventname", type="string", length=50)
*/
private $eventname;
/**
* #var string
*
* #ORM\Column(name="eventid", type="string", length=50)
*/
private $eventid;
/**
* #var string
*
* #ORM\Column(name="trapoid", type="string", length=100)
*/
private $trapoid;
/**
* #var string
*
* #ORM\Column(name="enterprise", type="string", length=100)
*/
private $enterprise;
/**
* #var string
*
* #ORM\Column(name="community", type="string", length=20)
*/
private $community;
/**
* #var string
*
* #ORM\Column(name="hostname", type="string", length=255)
*/
private $hostname;
/**
* #var string
*
* #ORM\Column(name="agentip", type="string", length=16)
*/
private $agentip;
/**
* #var string
*
* #ORM\Column(name="category", type="string", length=20)
*/
private $category;
/**
* #var string
*
* #ORM\Column(name="severity", type="string", length=255)
*/
private $severity;
/**
* #var string
*
* #ORM\Column(name="uptime", type="string", length=20)
*/
private $uptime;
/**
* #var datetime
*
* #ORM\Column(name="traptime", type="datetime")
*/
private $traptime;
/**
* #var string
*
* #ORM\Column(name="formatline", type="string", length=255)
*/
private $formatline;
/**
* #ORM\ManyToOne(targetEntity="Host", inversedBy="traps")
* #ORM\JoinColumn(name="agentip", referencedColumnName="ip", nullable=true)
*/
protected $host;
}
class Host
{
/**
* #var string
* #ORM\Id
* #ORM\Column(name="ip", type="string", length=16)
*/
private $ip;
/**
* #ORM\Column(name="hostname", type="string", length=100)
*/
private $hostname;
/**
* #ORM\Column(name="type", type="string", length=100)
*/
private $type;
/**
* #ORM\Column(name="importance", type="integer", length=1)
*/
private $importance;
/**
* #ORM\OneToMany(targetEntity="Trap", mappedBy="host")
*/
protected $traps;
}
Edited with error
The error is that I'm not allowed to delete or truncate my hosts table, which should be possible in my application, because traps must be able to exist without a host.
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`snmptt`.`snmptt`, CONSTRAINT `FK_9BF059B998B5BE9E` FOREIGN KEY (`agentip`) REFERENCES `hosts` (`ip`))
Posted as answer from comment as believe to be appropriate answer;
"If you are trying to remove this as straight sequel then yes the error is correct you cannot remove the parent before unlink the child, if there is no parent then this is fine if so unlink first then remove"

Doctrine - ManyToOne with table between

I want to create model which will have table users with reference to table CustomFieldValue nad table CustomField with reference to CustomFieldValue too. CustomFieldValue will have only id, value and two columns, one from users and second from CustomField. I want to have functionality like a dynamic adding a new fields in registration form. Is this good idea? If yes, please help me with this model, because it doesn't work:
User:
/**
* #ORM\Column(type="integer")
* #ORM\Id
* #ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* #ORM\Column(type="string", length=25, unique=true)
*/
private $username;
/**
* #ORM\Column(type="string", length=64)
*/
private $password;
/**
* #ORM\ManyToMany(targetEntity="Role", inversedBy="users",cascade={"persist"})
*
*/
private $roles;
/**
* #ORM\Column(type="string", length=60, unique=true)
*/
private $email;
/**
* #ORM\Column(type="string", length=60)
*/
private $sex;
/**
* #ORM\ManyToMany(targetEntity="Region", inversedBy="users")
* #ORM\JoinColumn(name="region", referencedColumnName="id")
*/
private $region;
/**
* #ORM\ManyToMany(targetEntity="Type", inversedBy="users")
* #ORM\JoinColumn(name="type", referencedColumnName="id")
*/
private $type;
/**
* #ORM\Column(name="is_active", type="boolean")
*/
private $isActive;
/**
* #ORM\ManyToOne(targetEntity="CustomFieldValue",inversedBy="id")
* #ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
private $customValues;
CustomFieldValue:
/**
* #var integer
*
* #ORM\Column(name="id", type="integer")
* #ORM\Id
* #ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* #var string
*
* #ORM\Column(name="value", type="string", length=255)
*/
private $value;
/**
*ORM\OneToMany(targetEntity="User", mapped-by="id")
*#ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
private $user;
/**
*#ORM\OneToMany(targetEntity="CustomField", mapped-by="id" )
*#ORM\JoinColumn(name="field_id", referencedColumnName="id")
*/
private $field;
CustomField:
/**
* #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;
/**
* #var string
*
* #ORM\Column(name="type", type="string", length=255)
*/
private $type;
/**
* #var boolean
*
* #ORM\Column(name="required", type="boolean")
*/
private $required;
/**
* #ORM\ManyToOne(targetEntity="CustomFieldValue", inversedBy="id")
* #ORM\JoinColumn(name="customfield_id", referencedColumnName="id")
*/
private $customValues;
Your mapping is a little off:
User Entity Should Be:
/**
* #ORM\ManyToOne(targetEntity="CustomFieldValue", inversedBy="user")
* #ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
private $customValues;
CustomFieldValue Should Be:
/**
*ORM\OneToMany(targetEntity="User", mappedBy="customValues")
*/
private $user;
/**
*#ORM\OneToMany(targetEntity="CustomField", mappedBy="customValues" )
*/
private $field;
CustomField should be:
/**
* #ORM\ManyToOne(targetEntity="CustomFieldValue", inversedBy="field")
* #ORM\JoinColumn(name="customfield_id", referencedColumnName="id")
*/
private $customValues;
You dont need the join columns when you are calling the mappedBy this already tells doctrine to look for the join column declaration on that field. For the mappedBy and inversedBy fields these are the fields that link the 2 together NOT the actual join column name.

How to look for an entity's self referenced entity in my Doctrine search?

When looking at the User entity, you can see its a manytomany self referencing relation. A user has many friends who are users themselves. How do I make this exact same search in within a user's friends? (in this query, I'm only looking for users who fill those conditions, but I would like to perform it in a $user friends)
$qb = $this->getEntityManager()->createQueryBuilder();
$qb->select( 'USER', '' )
->from( 'Entity\User', 'USER' )
->innerJoin( 'USER.eventNotified' )
->where(
$qb->expr()->andX(
$qb->expr()->gt( 'USER.latitude', ':minLat' ),
$qb->expr()->lt( 'USER.latitude', ':maxLat' ),
$qb->expr()->gt( 'USER.longitude', ':minLng' ),
$qb->expr()->lt( 'USER.longitude', ':maxLng' ),
$qb->expr()->eq( 'USER.available', 1 )
)
);
Here is the User entity (only properties for clarity):
class User
{
/**
* #var integer
*
* #ORM\Column(name="id", type="integer", nullable=false, unique=true)
* #ORM\Id
* #ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* #var integer
*
* #ORM\Column(name="fb_id", type="bigint", nullable=false, unique=true)
*/
private $fb_id;
/**
* #var string
*
* #ORM\Column(name="firstname", type="string", length=100, nullable=false, unique=false)
*/
private $first_name;
/**
* #var string
*
* #ORM\Column(name="lastname", type="string", length=100, nullable=true, unique=false)
*/
private $last_name;
/**
* #var string
*
* #ORM\Column(name="email", type="string", length=255, nullable=true, unique=true)
*/
private $email;
/**
* #var integer
*
* #ORM\Column(name="notation", type="integer", nullable=true, unique=true)
*/
private $notation;
/**
* Bidirectional - Many users have Many favorite comments (OWNING SIDE)
*
* #var \Doctrine\Common\Collections\Collection
*
* #ORM\ManyToMany(targetEntity="Entity\Category", inversedBy="userInterests")
*/
private $interests;
/**
* #var \Doctrine\Common\Collections\Collection
*
* #ORM\ManyToMany(targetEntity="Entity\User", cascade={"persist"})
* #ORM\JoinTable(name="friends",
* joinColumns={#ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={#ORM\JoinColumn(name="friend_user_id", referencedColumnName="id")}
* )
**/
private $friends;
/**
* #var \Doctrine\Common\Collections\Collection
*
* #ORM\OneToMany(targetEntity="Entity\Request", mappedBy="user", cascade={"remove"}, orphanRemoval=true)
* #ORM\JoinColumn(nullable=true)
*/
private $requests;
/**
* #var \Doctrine\Common\Collections\Collection
*
* #ORM\OneToMany(targetEntity="Entity\Request", mappedBy="friend", cascade={"remove"}, orphanRemoval=true)
* #ORM\JoinColumn(nullable=true)
*/
private $notifications;
/**
* Bidirectional - Many users have notified they want to go to different events (OWNING SIDE)
*
* #var \Doctrine\Common\Collections\Collection
*
* #ORM\ManyToMany(targetEntity="Entity\Event", inversedBy="userNotified", cascade={"persist"})
*/
private $eventNotified;
/**
* #var integer
*
* #ORM\Column(name="age", type="integer", length=3, nullable=true, unique=false)
*/
private $age;
/**
* #var string
*
* #ORM\Column(name="description", type="text", nullable=true, unique=false)
*/
private $description;
/**
* #var string
*
* #ORM\Column(name="picture", type="string", length=300, nullable=true, unique=false)
*/
private $picture;
/**
* #var string
*
* #ORM\Column(name="genre", type="string", length=10, nullable=true, unique=false)
*/
private $genre;
/**
* #var boolean
*
* #ORM\Column(name="isregistered", type="boolean", length=1, nullable=false, unique=false)
*/
private $registered;
/**
* #var string
*
* #ORM\Column(name="latitude", type="decimal", length=64, precision=25, scale=20, nullable=true, unique=false)
*/
private $latitude;
/**
* #var string
*
* #ORM\Column(name="longitude", type="decimal", length=64, precision=25, scale=20, nullable=true, unique=false)
*/
private $longitude;
/**
* #var \Entity\Security_Key
*
* #ORM\OneToOne(targetEntity="Entity\Security_Key", cascade={"persist","remove"}, orphanRemoval=true)
* #ORM\JoinColumns({
* #ORM\JoinColumn(name="private_key_id", referencedColumnName="id", unique=true, onDelete="SET NULL")
* })
*/
private $private_key;
/**
* #var boolean
*
* #ORM\Column(name="isavailable", type="boolean", length=1, nullable=false, unique=false)
*/
private $available = 0;
/**
* Constructor
*/
public function __construct()
{
$this->friends = new \Doctrine\Common\Collections\ArrayCollection();
}
Thank you
You can add additional conditions to a join, by using the WITH keyword.
$qb->select( 'USER' )
->from( 'Entity\User', 'USER' )
->where( 'USER.id = :userId' )
->leftJoin('USER.friends', 'f', 'WITH', $qb->expr()->andX(
$qb->expr()->gt( 'f.latitude', ':minLat' ),
$qb->expr()->lt( 'f.latitude', ':maxLat' ),
$qb->expr()->gt( 'f.longitude', ':minLng' ),
$qb->expr()->lt( 'f.longitude', ':maxLng' ),
$qb->expr()->eq( 'f.available', 1 )
)
)
Edited to show where to put the userId.

Categories