Symfony 6 - fetch certain fields - symfony6

In my table I have: 'id, message, user(from User::class, foreign key) etc...'
How can I select specific fields ? I would like fetch only message and username, how can I do ?
I tried this
public function getNameAndMessage()
{
return $this->createQueryBuilder('c')
->select('c.message, c.user.username')
->orderBy('c.id', 'ASC')
->setFirstResult(5)
->getQuery()
->getResult()
;
}
But an error appear: [Semantical Error] line 0, col 25 near 'username FROM': Error: Class App\Entity\Comment has no field or association named user.username
Someone can help me please

To access the properties of the User entity, you must join it to your query like this:
public function getNameAndMessage(){
return $this->createQueryBuilder('c')
->select('c.message, u.username')
->leftJoin('c.user','u')
->orderBy('c.id', 'ASC')
->getQuery()
->getResult();
}

Related

Symfony - How to use LIKE with COALESCE in a Doctrine request?

I have some trouble with LIKE and COALESCE in a Doctrine request (not 100% sure that the trouble is there).
I would like to search inside a database with a filter that match only if exist, and only with a part of the value (for example find 'abc' with the filter set to 'ab').
This request works fine :
public function findUsers($entreprise, $filtres)
{
$filtre_name = $filtres['name'];
return $this->createQueryBuilder('users')
->where('users.entreprise = :entreprise')
->andWhere('users.name = COALESCE(:filtre_name, users.name)')
->setParameter('entreprise', $entreprise)
->setParameter('filtre_name', $filtre_name)
->orderBy('users.name', 'ASC')
->getQuery()
->getResult();
}
It return all the users of the company "entreprise" where "filtre_name" match (if not null) with "name" in the database. (If "filtre_name" is null, then the where match for all the database thanks to COALESCE).
I would like now to do the same thing but with "LIKE" instead of "=" because for now the name has to match perfectly and I would like a match for "abc" with only "ab" inside the filter for example.
public function findUsers($entreprise, $filtres)
{
$filtre_name = $filtres['name'];
return $this->createQueryBuilder('users')
->where('users.entreprise = :entreprise')
->andWhere('users.name LIKE COALESCE(:filtre_name, users.name)')
->setParameter('entreprise', $entreprise)
->setParameter('filtre_name', '%'.$filtre_name.'%')
->orderBy('users.name', 'ASC')
->getQuery()
->getResult();
}
The result is an error : "Warning: Undefined property: Doctrine\ORM\Query\AST\CoalesceExpression::$type".
I have find a solution. I build my queryBuilder with parameter only if they are not Null. So I remove COALESCE and now I can use LIKE.
public function findUsers($entreprise, $filtres)
{
$filtre_nom = $filtres['nom'];
$filtre_gestionnaire = $filtres['gestionnaire'];
$qb = $this ->createQueryBuilder('users');
$qb ->where('users.entreprise = :entreprise')
->setParameter('entreprise', $entreprise);
if ($filtre_nom != Null) {
$qb ->andWhere('users.nom LIKE :filtre_nom')
->setParameter('filtre_nom', '%'.$filtre_nom.'%');
}
if ($filtre_gestionnaire != Null) {
$qb ->andWhere('users.gestionnaire LIKE :filtre_gestionnaire')
->setParameter('filtre_gestionnaire', '%'.$filtre_gestionnaire.'%');
}
$qb->addorderBy('users.nom', 'ASC');
return $qb ->getQuery()
->getResult();
}

Symfony - Doctrine createQueryBuilder from json_array

Crete custom query in Symfony 4 and I use createQueryBuilder().
My entity have column price_ranges type type="json_array"
This data I store in this column
{
"from": "10.10.2010",
"to": "10.20.2010",
"pricePerNight": 100,
"minStay": 7
}
Want to query data by pricePerNight key in price_ranges column.
I create function but I have the following error:
[Semantical Error] line 0, col 41 near 'price_ranges': Error: Class App\Entity\House has no field or association named price_ranges
Here is my function. Where am I wrong?
public function findDataByPriceRange()
{
$qb = $this->createQueryBuilder('u');
$qb->select('u')
->where('u.price_ranges LIKE :price_ranges')
->setParameter('pricePerNight', 100);
return $qb->getQuery()->getResult();
}
After I edit my function:
public function findVillasByPriceRange()
{
$qb = $this->createQueryBuilder('u');
$qb->select('u')
->where('u.priceRanges LIKE :priceRanges')
->setParameter('pricePerNight', 100);
return $qb->getQuery()->getResult();
}
I get this error:
Invalid parameter: token pricePerNight is not defined in the query.
You need to use the same parameter name in where() and setParameter() like this
->where('u.priceRanges LIKE :parameterName')
->setParameter('parameterName', 100);

How QueryBuilder's select work?

I have a Category that has many Marker. I want to get a category by id with all the markers associated.
I have this query in my Marker's repository:
public function findOneByIdJoinedToCategory($id)
{
return $this->createQueryBuilder('m')
->innerjoin('m.category', 'c')
->where('c.id = :id')
->setParameter('id', $id)
->getQuery()
->getResult()
;
}
It works as intended, i get the category's data with an array marker with all the marker data. But I don't want all the data field so I tested this query:
public function findOneByIdJoinedToCategory($id)
{
return $this->createQueryBuilder('m')
->select('m.id', 'm.name', 'm.description', 'm.vicinity', 'm.geo')
->innerjoin('m.category', 'c')
->addSelect('c.id', 'c.name')
->where('c.id = :id')
->setParameter('id', $id)
->getQuery()
->getResult()
;
}
When I do this, I except to have only the field I selected, but I have an extra array and get this error : Call to a member function getCategory() on array
How do I select my field and get a category with all its marker ?
I think you need to use Doctrine partial objects here
So select will look something like this
->select('partial m.{id, name, description...

Get related record one to many relationships Symfony2

I want to check if the current user has already a record for the current date.The User entity has many Timerecord and Timerecord has one User. So far,
This two entities resides in two different bundles
Project
UserBundle
TimerecordBundle
controller
$user = $this->container->get('security.context')->getToken()->getUser();
$userr = $user->getUsername();
$alreadyLoggedIn = $em->getRepository('EmployeeBundle:Timerecord')->findAlreadyTimedInToday($userr);
var_dump($alreadyLoggedIn);
die();
Respository
public function findAlreadyTimedInToday($userr)
{
return $this
->createQueryBuilder('t')
->select('u.username')
->from('User u')
->join('u.Timerecord t')
->where('u.username LIKE :currentuser')
->setParameter('currentuser',$userr)
->getQuery()
->getSingleResult()
;
}
I got this exception
Warning: Missing argument 2 for Doctrine\ORM\QueryBuilder::from()
How do you fetch the related user in this case?
The alias for the from part should be given to the second argument.
Change your method to this:
public function findAlreadyTimedInToday($userr)
{
return $this
->createQueryBuilder('t')
->select('u.username')
->from('User', 'u')
->join('u.Timerecord', 't')
->where('u.username LIKE :currentuser')
->setParameter('currentuser', $userr)
->getQuery()
->getSingleResult()
;
}

Error: Invalid PathExpression. Must be a StateFieldPathExpression.

I'm working on a symfony project entity with query builder. When I try to run this function I get this issue.
[Semantical Error] line 0, col 9 near 'category FROM': Error: Invalid PathExpression. Must be a StateFieldPathExpression.
public function json_filterAllproductsAction() {
$search = "";
$category = 1;
//Combine tables and create the query with querybuilder
$em = $this->container->get('doctrine.orm.entity_manager');
$qb = $em->createQueryBuilder();
$qb->select('p.category')
->from('EagleAdminBundle:Products', 'p')
->orderBy('p.id', 'DESC');
if ($category != 0) {
$qb->andWhere('p.category = :category')
->setParameter('category', $category);
}
$qb->andWhere('p.productTitle LIKE :title')
->setParameter('title', "$search%");
//convert to json using "JMSSerializerBundle"
$serializer = $this->container->get('serializer');
$jsonproducts = $serializer->serialize($qb->getQuery()->getResult(), 'json');
return new Response($jsonproducts);
}
I think error is in,
$qb->select('p.category')
It would be great help someone can help me.
You need to fetch category as well in your join. Something like this should work fine:
$qb->select('p', 'c')
->from('EagleAdminBundle:Products', 'p')
->orderBy('p.id', 'DESC')
->join('p.category', 'c');
if ($category != 0) {
$qb->andWhere('p.category = :category')
->setParameter('category', $category);
}
$qb->andWhere('p.productTitle LIKE :title')
->setParameter('title', "$search%");
Note if you don't want to limit your search to only products that have categories you can change the join to a leftJoin.
Also note you can have the serializer configured to serialize the category property of product. Then you should just be able to fetch a product and have it automatically serialize the category for you.

Resources