Symfony Repository Helper
TangoMan Repository Helper provides trait with useful functions for your repositories., (*1)
Open a command console, enter your project directory and execute the following command to download the latest stable version of this bundle:, (*2)
$ composer require tangoman/repository-helper
This command requires you to have Composer installed globally, as explained in the installation chapter of the Composer documentation., (*3)
Add "use" statement just like when you're using a trait., (*4)
<?php namespace FoobarBundle\Repository; use Doctrine\ORM\EntityRepository; use TangoMan\RepositoryHelper\RepositoryHelper; /** * Class FoobarRepository */ class FoobarRepository extends EntityRepository { use RepositoryHelper; }
use Symfony\Component\HttpFoundation\Request; class FoobarController extends Controller { /** * @Route("/") */ public function indexAction(Request $request) { // Show searchable, sortable, paginated user list $em = $this->get('doctrine')->getManager(); $foobars = $em->getRepository('AppBundle:Foobar')->findByQuery($request); return $this->render( 'admin/foobar/index.html.twig', [ 'foobars' => $foobars, ] ); }
<label for="inputUser">User</label> <input type="text" name="user-username" id="inputUser" class="form-control" value="{{ app.request.get('user-username')|join(', ') }}"/>
Will generate this: .../admin/posts/?user-username=admin, (*5)
<th class="{{ app.request.query.get('order') == 'user-username' ? app.request.query.get('way', 'ASC') }}"> <a href="{{ path('app_admin_post_index', app.request.query.all|merge({ 'page' : 1, 'order' : 'user-username', 'way' : app.request.query.get('order') == 'user-username' and app.request.query.get('way', 'ASC') == 'ASC' ? 'DESC' : 'ASC'})) }}"> User </a> </th>
Will generate this: .../admin/posts/?page=1&order=user-username&way=ASC, (*6)
function | description | parameters | return |
---|---|---|---|
getTableName() | Returns current table name | n/a | string |
countBy($criteria = []) | Returns element count, filtered by given criteria | array | integer |
distinct($property, $criteria = []) | Lists distinct items from desired column, filtered by given criteria | string, array | array |
findAllPaged($page = 1, $limit = 10, $criteria = []) | Returns X results with pagination, starting from given page, filtered by given criteria | integer, integer, array | (object)Paginator |
findByQuery(Request $request, $criteria = []) | Returns query result with pagination, filtered by given criteria | (object)Request, array | (object)Paginator |
findByQueryScalar(Request $request, $criteria = []) | Return query as scalar result with pagination, filtered by given criteria | (object)Request, array | (object)Paginator |
export(Request $request, $criteria = []) | Return all objects as scalar result, filtered by given criteria | (object)Request, array | array |
parameter | type | value |
---|---|---|
order | string | switch-entity-property |
way | string | (ASC/DESC) |
limit | integer | [1-9]+\d? |
page | integer | [1-9]+\d? |
join | string | switch-entity-property |
Switch values for mode/operator/action, (*7)
switch | mode | description |
---|---|---|
a | andWhere | andWhere |
b | search | boolean |
c | order | count |
e | search | exactMatch |
l | search | like |
n | search | notNull |
o | orWhere | orWhere |
p | order | property |
r | order | orderBy |
s | search | simpleArray |
When symfony raises following QueryException exception:, (*8)
[Semantical Error] line X, col XX near 'foo LIKE': Error: Invalid PathExpression. Must be a StateFieldPathExpression., (*9)
It means that you have an error inside your form: <input name="foo-bar">
, attribute doesn't target appropriate joined entity., (*10)
Try <input name="foo-bar-title">
, or <input name="bar-title">
, TangoMan Repository Helper will automatically handle the join., (*11)
If you find any bug please report here : Issues, (*12)
Copyright (c) 2018 Matthias Morin, (*13)
Distributed under the MIT license., (*14)
If you like TangoMan Repository Helper please star! And follow me on GitHub: TangoMan75 ... And check my other cool projects., (*15)
Matthias Morin | LinkedIn, (*16)