2015-12-17

Can't find a persistence unit named null in deployment

Podczas zabaw z Javą, JPA oraz JBoss napotkałem na problem, przez który straciłem troszkę chwil życia. Przy próbie użycia annotacji @PersistenceContext otrzymywałem błąd serwera: Can't find a persistence unit named null in deployment (...).

Problem okazał się trywialny - mój IDE (Intellij IDEA) przy instalacji JPA utworzył plik persistence.xml w niewłaściwym miejscu. Aby zatem rozwiązać ten kosmiczny problem wystarczy przenieść plik persistence.xml do katalogu your_app_name\src\main\resources\META-INF.

żródło: stackoverflow.com

Install Oracle JDK on Linux Mint 17.3

Ściągamy (do katalogu Pobrane) najnowsze JDK ze strony Oracle w odpowiedniej dla systemu operacyjnego wersji (32-bit lub 64-bit). Następnie rozpakowujemy ściągnięty plik, odpalamy terminal i wpisujemy:

sudo apt-get update
sudo apt-get remove openjdk*
sudo mkdir -p /opt/java
sudo mv ~/Pobrane/jdk1.8.0_65 /opt/java/
sudo update-alternatives --install "/usr/bin/java" "java" "/opt/java/jdk1.8.0_65/bin/java" 1
sudo update-alternatives --set java /opt/java/jdk1.8.0_65/bin/java
java --version

źródło: community.linuxmint.com

2015-12-02

bootstrap-datepicker: position bug

Korzystając z biblioteki bootstrap-datepicker spotkałem się z pewnym błędem w pozycjonowaniu okienka:

Problem rozwiązałem modyfikując kilka linijek w pliku js/bootstrap-datepicker.js:

Przed modyfikacją:

var left = offset.left - appendOffset.left, top = offset.top - appendOffset.top;

Po modyfikacji:

var left = offset.left - appendOffset.left, top = offset.top;

2015-11-27

Z underscore na CamelCase

Jak zamienić w PHP string z this_is_test na ThisIsTest? Poniżej znajduje się linijeczka kodu, która robi taką fajną rzecz.

preg_replace('/(?:^|_)(.?)/e', "strtoupper('$1')", "this_is_test");

źródło: devops.zone

Umieściłem to polecenie w bibliotece tools dostępnej w serwisie GitHub.

2015-10-21

SOLID w programowaniu obiektowym

Nazwa SOLID w programowaniu obiektowym to skrót, który określa pięć założeń:
  • S - Single responsibility (jedna odpowiedzialność)
  • O - Open/close (otwarcie na rozszerzanie, zamknięcie na modyfikowanie)
  • L - Liskov substitution (zasada podstawienia)
  • I - Interface segregation (segregacja interfejsów)
  • D - Dependency inversion (odwrócenie zależności)

The Single Responsibility Principle

A class should have only one reason to change.

Klasa powinna mieć tylko jedną odpowiedzialność. Klasy zbyt rozbudowane mogą powodować konflikty - kilka zespołów programistów może pracować na tym samym kodzie co może generować problemy i niepotrzebną stratę czasu.

The Open/Closed Principle

Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification.

Liskov substitution

Subtypes must be substitutable for their base types.

Podklasy powinny w taki sposób nadpisywać metody głównej klasy aby zburzyć założonej funkcjonalności z punktu widzenia klienta.

Interface segregation

Zasada segregacji interfejsów mówi o sposobie komunikacji między logiką biznesową a klientem. Aplikacja złożona z modułów powinna opierać się na interfejsach z których klient może korzystać. Należy przy tym pamiętać, że klient nie powinien mieć dostępu do części interfejsu, z których nie korzysta.

Dependency inversion

Dependency inversion - odwrócenie zależności - założenie, która polega na tym aby moduły wyższego poziomu komunikowały się z modułami niższego poziomu za pomocą ustalonego poza nimi zbiorem zasad (interfejsem). Zabieg ten pozwala na łatwiejsze późniejsze modyfikowanie programu.

Źródła

2015-10-13

PHP DateTime: Pierwszy i ostatni dzień poprzedniego miesiąca

Od PHP 5.3 pierwszy i ostatni dzień miesiąca można wybrać w bardzo prosty sposób:
$dataod = new \DateTime('first day of previous month');
$datado = new \DateTime('first day of previous month');
Można w ten sposób w prosty sposób przypisać domyślne wartości w formularzu:
$command = new EksportSwiadczenDoCsvCommand();
$command->setDataod(new \DateTime('first day of previous month'));
$command->setDatado(new \DateTime('last day of previous month'));

$form = $this->createForm('platne_eksport_zlecen_do_csv', $command);

$form->handleRequest($request);

if($form->isValid()){
    //...
}
W ten sam sposób możemy wybrać również pierwszy i ostatni dzień aktualnego miesiąca - odpowiadają za to zmienne 'first day of this month' oraz 'last day of this month'.

2015-10-06

Finch - Instant Messaging client

Konfiguracja konsolowego komunikatora Finch znajduje się w katalogu ~/.purple - przenosząc się na inną maszynkę linuxową warto zabrać ten właśnie katalog ze sobą. :-)

2015-10-03

Auto-update paczki w Packagist

Aby w portalu packagist.org była zawsze aktualna wersja naszej paczki z GitHub'a należy wpisać w konsoli następujące polecenie:

curl -XPOST -H'content-type:application/json' 'https://packagist.org/api/update-package?username=m4rc1no5&apiToken=API_TOKEN' -d'{"repository":{"url":"git@github.com:m4rc1no5/ColorBashPrompt.git"}}'

Gdzie API_TOKEN to nasz token z serwisu Packagist (dostępny na stronie profilu).

2015-09-30

Dysk SSD i Linuks Mint/Ubuntu

Kilka rzeczy, które warto ustawić mając system Mint/Ununtu zainstalowany na dysku SSD.

Swap

W pliku /etc/sysctl.conf dodajemy na dole następujące zmienne:

vm.swappiness = 1
vm.vfs_cache_pressure=50

Ja u siebie wyłączyłem swapa całkowicie (mam sporo ramu i mały dysk SSD):

vm.swappiness = 0

Wyłączenie "access time stamp"

W pliku /etc/fstab dla partycji dysku SSD dodajemy parametr noatime:

UUID=fcbaca8f-a6f7-4fa4-981a-8cd979a2e59d /               ext4    noatime,errors=remount-ro 0       1

Włączenie TRIM

Dysk SSD powinien być regularnie czyszczony. Czyszczenia można dokonać wykonując polecenie:

sudo fstrim -v /

Gdzie znak / to partycja dysku SSD. Jeśli mamy więcej dysków/partycji to dla każdego/każdej z nich wykonujemy to polecenie osobno. Dobrym zwyczajem jest wykonywanie tego polecenia podczas startu systemu. Aby tego dokonać należy w pliku /etc/rc.local dodać linie (przed exit 0):

# Run fstrim at boot
LOG=/var/log/trim.log
fstrim -v / >> $LOG
echo "Time: $(date)" >> $LOG

exit 0

Kilka dodatkowych zabiegów

Aby zmniejszyć ilość zapisów na dysku warto również unikać hibernacji oraz defragmentacji dysku SSD. Można również ograniczyć lub wyłączyć cache w przeglądarkach www.

źródło: http://www.leniwiec.org/

2015-09-24

Utworzenie lokalnej domeny przy użyciu Nginx i Virtual Hosts

Aby utworzyć lokalną domenę (np. http://test.lh), która zastąpiłaby adres http://localhost/test/ wystarczy kilka prostych ruchów:
  • Tworzymy katalog test w katalogu /var/www/html/
  • Tworzymy plik index.html w katalogu test
  • Dajemy uprawnienia 0775 dla katalogu test
  • W pliku index.html wpisujemy hello world!
  • Tworzymy plik test_lh.conf w katalogu /etc/nginx/sites-available/
  • W pliku test_lh.conf wpisujemy:
    server {
        listen   80; ## listen for ipv4; this line is default and implied
        #listen   [::]:80 default ipv6only=on; ## listen for ipv6
    
        root ${htdocs}${website};
        index index.html index.htm index.php;
    
        # Make site accessible from http://localhost/
        server_name ${website}.lh;
    }
    
  • W katalogu /etc/nginx/sites-enabled/ tworzymy link symboliczny do /etc/nginx/sites-available/test_lh.conf
    ln -s /etc/nginx/sites-available/test_lh.conf /etc/nginx/sites-enabled/test_lh.conf
  • W pliku /etc/hosts dodajemy linijkę 127.0.0.1 test.lh
  • Uruchamiamy przeglądarkę, wpisujemy w pasek adresy test.lh i cieszymy się z napisu hello world!

Skrypt do automatycznego utworzenia lokalnej domeny

Na GitHubie umieściłem skrypt, który wykonuje opisane ruchy w sposób automatyczny.

Utworzenie lokalnej domeny przy użyciu Apache2 i Virtual Hosts

We jednym z wcześniejszych wpisów umieściłem instrukcję w jaki sposób utworzyć lokalną domenę pod Apache2.

2015-09-12

Programuj pod kątem interfejsu

Nie deklaruj zmiennych jako egzemplarzy określonych klas konkretnych. Zamiast tego wykorzystaj tylko interfejs zdefiniowany w klasie abstrakcyjnej.

2015-08-25

Symfony2 - debugowanie skryptów uruchamianych z konsoli

Istnieje możliwość debugowania kodu odpalanego z konsoli (app/console). Aby móc cieszyć się takim dobrodziejstwem wystarczy:

w php.ini (dla cli) wpisać:

xdebug.remote_enable=1

przed poleceniem app/console wpisać:

SERVER_PORT=9000 SERVER_NAME='PHPSTORM' php -dxdebug.remote_autostart=On app/console test

2015-08-06

Symfony2 - FOSJsRoutingBundle

Za pomocą bundla FOSJsRoutingBundle można korzystać z routingu Symfony w javascriptowym kodzie. Poniżej krótki przykład:

PHP:

 /**
  * @Route("/ks", options={"expose" = true}, name="nfz.raport_wykbadpoz_kolumny_standardowe")
  * @Template("raport/kolumny_standardowe.html.twig")
  *
  * @return array
  */
 public function kolumnyStandardoweAction()
 {
  $ar_kolumny_standardowe = $this->raportWykbadpozManager->getKolumnyStandardowe();
  return compact('ar_kolumny_standardowe');
 }

JavaScript:

$.wczytajKolumnyStandardowe = function(url){
    var kolumny_standardowe = $("#kolumny_standardowe");

    $.post(Routing.generate("nfz.raport_wykbadpoz_kolumny_standardowe"), {}, function(data){
        kolumny_standardowe.html(data);
    });
};
Należy pamiętać o options={"expose" = true} w annotacjach. Więcej informacji na githubie.

2015-08-05

Symfony2 form - wynik w innej akcji i w nowym oknie

W Symfony po submicie formularza wracamy do tej samej akcji (w naszym przypadku do indexAction()). Aby to zmienić wystarczy dodać odpowiednią opcję przy tworzeniu obiektu formularza (form). Istnieje również możliwość otworzenia wyniku w nowym oknie. Całość można zobaczyć w poniższym kodzie:

 /**
  * @Route("/", name="nfz.raport_wykbapoz")
  * @Template()
  *
  * @return array
  */
 public function indexAction()
 {
  //...
  $form = $this->createForm('nfz_raport_wykbadpoz', $object, [
   'action' => $this->generateUrl('nfz.raport_wykbadpoz_wynik'),
   'attr' => [
    'target' => '_blank'
   ]
  ]);

  return [
   'form' => $form->createView()
  ];
 }

 /**
  * @Route("/wynik", name="nfz.raport_wykbadpoz_wynik")
  * @Template()
  *
  * @param Request $request
  * @return array
  */
 public function wynikAction(Request $request)
 {
  //zabezpieczenie malutkie
  if($request->getMethod() != 'POST') {
   return new RedirectResponse($this->generateUrl('nfz.raport_wykbapoz'));
  }

  //utworzenie obiektu formularza
  $form = $this->createForm('nfz_raport_wykbadpoz');
  //pobranie danych z submitowanego formularza
  $form->handleRequest($request);

  //walidacja formularza
  if($form->isValid()){
   //pobranie danych z formularza
   $data = $form->getData();
  }
  //...
  return [];
 }

Widać tutaj, że funkcja kontrolera wynikAction() przchwytuje dane z submitowanego w indexAction() formularza.

2015-08-04

Wyświetlenie okienka potwierdzającego po kliknięciu w link

Czasem przed wykonaniem pewnej akcji (np. przed usunięciem pozycji) chcemy wyświetlić okienko potwierdzające czy na pewno wykonać daną czynność. Aby to zrobić wystarczy dodać do linka atrybut onclick:

Twig:
Usuń
Javacript:
function confirmDelete(id) {
    return confirm("Czy na pewno usunąć wybraną pozycję (" + id + ")?");
}

2015-08-02

Zmiana formatu daty w Joomla! 3.4.3

Załóżmy, że utworzyliśmy artykuł w piątek, 24 lipiec 2015. Jak widać odmiana miesiąca nie jest prawidłowa - można się pobawić i stworzyć funkcję, która prawidłowo (po Polsku) odmienia miesiące. Ja jednak na potrzeby swojego projektu zmienię po prostu format daty - z piątek, 24 lipiec 2015 na piątek, 24-07-2015.
Aby tego dokonać wystarczy zmienić jedną linię w pliku language/overrides/pl-PL.override.ini:

DATE_FORMAT_LC3="l, d F Y"

na 

DATE_FORMAT_LC3="l, d-m-Y"

2015-06-21

Przeniesienie Redmine (2.0) na inny serwer (Ubuntu 14.04)

Na starej maszynce wykonujemy kopię katalogu, w którym znajduje się Redmine (u mnie to katalog redmine katalogu domowym) oraz zrzut bazy (u mnie bazą jest PostgreSQL). Następnie dane przenosimy na docelowy serwer i jedziemy wg poniższej instrukcji:
sudo apt-get install make
sudo apt-get install postgresql
sudo apt-get install postgresql-server-dev-9.3

# utworzenie w bazie usera redmine
psql -U postgresql template1
create user redmine with password 'twoje_haselko';
alter user redmine with superuser;
# wczytanie kopii bazy
\i backup/redmine/day/redmine-2015.03.21.15.28.sql

# wychodzimy z bazy i instalujemy kolejne rzeczy
sudo apt-get install ruby1.9.3 libmysqlclient-dev
sudo apt-get install libmagickcore-dev libmagickwand-dev
sudo gem install bundler
sudo gem install json -v '1.7.3'
sudo gem install pg -v '0.13.2'
cd redmine/redmine-2.0/
bundle install --without development test

# odpalenie redmine
bundle exec ruby script/rails server webrick -e production

# sprawdzenie czy wszystko smiga wchodzac przez http://ip-serwera:3000
Jeśli wszytko ładnie działa to możemy zabrać się za instalację Apache2 oraz Passengera:
sudo apt-get install apache2
sudo gem install passenger
sudo apt-get install libapache2-mod-passenger
Dodajemy PassengerDefaultUser www-data (tylko tę linię) do pliku /etc/apache2/mods-available/passenger.conf - cały plik powinien wyglądać mniej więcej tak:

  PassengerDefaultUser www-data
  PassengerRoot /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini
  PassengerDefaultRuby /usr/bin/ruby

Tworzymy plik /etc/apache2/sites-available/redmine i wpisujemy w nim:
[VirtualHost *:80]
    ServerName redmine.lh
    DocumentRoot /home/user/redmine/redmine-2.0/public
    ServerAdmin twoj@mail.pl
    LogLevel warn
    ErrorLog /var/log/apache2/redmine_error
    CustomLog /var/log/apache2/redmine_access combined
    [Directory /home/user/redmine/redmine-2.0/public]
       Options Indexes FollowSymLinks MultiViews
       AllowOverride None
       Order allow,deny
       allow from all
       RailsBaseURI /redmine
       PassengerResolveSymlinksInDocumentRoot on
    [/Directory]
[/VirtualHost]
Zamień znaki [] na <>.

sudo ln -s /etc/apache2/sites-available/redmine /etc/apache2/sites-enabled/redmine
sudo a2enmod passenger
sudo service apache2 restart

2015-06-19

Instalacja Nginx zamiast Apache2

Nadszedł czas na coś nowego - zrezygnowałem z Apache2 na rzecz Nginx'a. Z Nginxem dobrze działa PHP FPM, który daje kilka ciekawych opcji - np: możliwość użycia eventu Symfony o nazwie kernel.terminate.


Jak zainstalować Nginx'a i PHP FPM pod Mintem (lub Ubuntu)?

# zatrzymujemy apache'a
sudo service apache2 stop

# usuwamy apache'a z autostartu
sudo update-rc.d apache2 disable

# instalujemy nginx'a
sudo apt-get update
sudo apt-get install nginx
sudo service nginx start
sudo service nginx status

# instalujemy PHP FPM
sudo apt-get install php5-fpm

# zmieniamy cgi.fix_pathinfo z 1 na 0
sudo mc -e /etc/php5/fpm/php.ini -> cgi.fix_pathinfo=0

# restartujemy PHP FPM
sudo service php5-fpm restart

Po kilku tygodniach pracy z lokalnie zainstalowanym Nginx'em mam nieodparte wrażenie, że jest on szybszy i lżejszy niż Apache2.

2015-05-29

Gmail nie czyta zewnętrznych plików css

Gmail nie odczytuje zewnętrznych plików CSS z maili napisanych w HTML - usuwa wszystko co jest przed i po treści wiadomości. Poniższy kod nie zadziała:
Kontakt:
Telefon: {{ jednostka.tel1 }}
Zadziała za to kod, w którym cssy umieszczamy od razu w stylach:
Kontakt:
Telefon: {{ jednostka.tel1 }}
Konwertowania kodu HTML i CSS (automatycznego wrzucania do styli) można dokonać np. tutaj.

2015-05-22

Debuggowanie aplikacji webowych za pomocą Xdebug i PhpStorm

PhpStorm umożliwia debuggowanie kodu, który wyświetlany jest aktualnie przez przeglądarkę internetową. Aby móc cieszyć się tym dobrodziejstwem musimy przejść kilka kroków opisanych poniżej (instrukcja dla dystrybucji linuksa Ubuntu/Mint).

Instalacja Xdebug

sudo apt-get install php5-xdebug
Do php.ini dodajemy:
zend_extension="/usr/lib/php5/20121212/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_handler=dbgp 
xdebug.remote_mode=req
xdebug.remote_host=127.0.0.1 
xdebug.remote_port=9000
xdebug.max_nesting_level=300

Restartujemy Apache'a:
sudo service apache2 restart

Utworzenie przycisków odpalających debuggera

Aby uruchomić i zatrzymać debuggera w przeglądarce trzeba podać jej specjalne parametry. Można to zrobić ręcznie lub utworzyć sobie do tego odpowiednie przyciski - np. na pasku zakładek (ja używam właśnie takiego rozwiązania). Pod adresem https://www.jetbrains.com/phpstorm/marklets/ można wygenerować potrzebny kod. 

Start debugger:
javascript:(/** @version 0.5.2 */function() {document.cookie='XDEBUG_SESSION='+'PHPSTORM'+';path=/;';})()

Stop debugger:
javascript:(/** @version 0.5.2 */function() {document.cookie='XDEBUG_SESSION='+''+';expires=Mon, 05 Jul 2000 00:00:00 GMT;path=/;';})()

Uruchomienie debuggera

W przeglądarce uruchamiamy debuggera (np. przyciskiem start debugger), przechodzimy do PhpStorma i tam również włączamy debuggowanie (po wcześniejszym ustawieniu breakpointów oczywiście). Wracamy do przeglądarki, uruchamiamy badaną aplikację PHP i po napotkaniu breakpointa powinno nas przenieść automatycznie do PhpStorma w zaznaczone miejsce.

Więcej na ten temat znaleźć można tutaj.

2015-05-10

Utworzenie lokalnej domeny przy użyciu Apache2 i Virtual Hosts

Aby utworzyć lokalną domenę (np. http://test.lh), która zastąpiłaby adres http://localhost/test/ wystarczy kilka prostych ruchów:
  • Tworzymy katalog test w katalogu /var/www/html/
  • Tworzymy plik index.html w katalogu test
  • Dajemy uprawnienia 0775 dla katalogu test
  • W pliku index.html wpisujemy hello world!
  • Tworzymy plik test_lh.conf w katalogu /etc/apache2/sites-available/
  • W pliku test_lh.conf wpisujemy:
    
      ServerAdmin marcin.zaremba@gmail.com
      ServerName test.lh
      ServerAlias *.test.lh
      DocumentRoot /var/www/html/test
      ErrorLog /var/log/apache2/test_error.log
      CustomLog /var/log/apache2/test_access.log combined
      
        # enable the .htaccess rewrites
        AllowOverride All
        Allow from All
        Require all granted
      
    
    
    Uwaga! Zamiast id="/var/www/html/test" piszemy po prostu /var/www/html/test.
  • W katalogu /etc/apache2/sites-enabled/ tworzymy link symboliczny do /etc/apache2/sites-available/test_lh.conf
    ln -s /etc/apache2/sites-available/test_lh.conf /etc/apache2/sites-enabled/test_lh.conf
  • W pliku /etc/hosts dodajemy linijkę 127.0.0.1 test.lh
  • Uruchamiamy przeglądarkę, wpisujemy w pasek adresy test.lh i cieszymy się z napisu hello world!

Skrypt do tworzenia lokalnej domeny


Na githubie umieściłem skrypt, który wykonuje wszystkie opisane ruchy w sposób automatyczny. Wystarczy wpisać w konsoli:
sudo ./addLocalHost.sh test
a wszystkie wyżej opisane kroki wykonają się za nas i będziemy mogli cieszyć się nową lokalną domeną test.lh.

Poniżej przedstawiam kod, który wykonuje to zadanie:

2015-04-27

PHP Deprecated - comment starting with '#'

PHP Deprecated:  Comments starting with '#' are deprecated in /etc/php5/cli/conf.d/imap.ini on line 1 in Unknown on line 0

W przypadku powyższego błędu wchodzimy w plik imap.ini i zastępujemy znak '#' znakiem ';'.

2015-04-03

Symfony2 i generowanie plików PDF

KnpSnappyBundle

Do generowania plików PDF w Symfony2 wiele osób poleca bundla o nazwie KnpSnappyBundle. Wykorzystuje on jednak wkhtmltopdf (open source'owe konsolowe narzędzie do tworzenia plików PDF na podstawie HTML), które trzeba dodatkowo zainstalować na serwerze produkcyjnym (wraz z wieloma innymi bibliotekami). To według mnie spora wada tego bundla ale jeszcze do przeskoczenia. Większym minusem wkhtmltopdf jest to, że PDF'y na różnych maszynach generują różne pliki PDF. Różnice są niby niewielkie ale przy mojej pracy zupełnie dyskwalifikujące to rozwiązanie.

PdfBundle

PdfBundle autorstwa Piotra Śliwy eliminuje wady wcześniej omówionego bundla. Nie trzeba na serwerze instalować osobnych  systemowych narzędzi i na każdej maszynie wydruk wygląda identycznie. PdfBundle korzysta z biblioteki PHPPfd tego samego autora. PHPPfd tworzy pliki PDF (lub pliki graficzne) na podstawie plików XML co może być to istotną wadą dla niektórych użytkowników. Dla mnie jednak jest to rozwiązanie niemal idealne.

PdfBundle - problem z img

Podczas pracy trafiłem na problem, który zawieszał całego Apache'a przy próbie wygenerowania pliku PDF z dużym plikiem jgp:

    
        
    

Aby pozbyć się problemu wystarczy element dynamic-page zmienić na page - czyli:

    
        
    

2015-01-28

Firefox - przekroczono limit czasu połączenia

Jeśli pojawia Ci się taki komunikat po ok. 300 sekundach (mimo wszelkich zmian w php.ini) to być może odpowiada za to zmienna network.http.response.timeout. Firefox domyślnie ma przy tej zmiennej wartość 300 sekund - aby to zmienić wystarczy wejść w opcje (about:config), zwiększyć odpowiednio wartość zmiennej i zrestartować przeglądarkę.

2015-01-14

Doctrine i Symfony - wyświetlenie SQL'a z parametrami

Wyświetlić utworzonego SQL'a możemy za pomocą polecenia:
$qb->getQuery()->getSQL();

a parametry tegoż zapytania za pomocą polecenia:
$qb->getParameters();

Wcześniej oczywiście tworzymy obiekt $qb oraz zapytanie - np:
$qb = $this->createQueryBuilder('l')
 ->where('l.del = :del')
 ->andWhere('l.wysw = :wysw')
 ->andWhere('lower(l.nazwisko) LIKE lower(:szukana) OR lower(l.nrpwz) LIKE lower(:szukana)')
 ->orderBy('l.nazwisko')
 ->setParameters(array(
  'del' => 'false',
  'wysw' => 'true',
  'szukana' => '%' . $szukana . '%'
 ));

Wynik zapytania pobieramy w poniższy sposób:
$qb->getQuery()->getResult();

2015-01-13

Doctrine Symfony PostgreSQL - LIKE i OR

Przykład zapytania SQL z klauzulą LIKE:
$qb = $this->createQueryBuilder('k')
 ->where('k.kod_res_8 = :kod_res_8')
 ->andWhere('lower(k.ulica) LIKE lower(:ulica)')
 ->setParameter('kod_res_8', $kod_res_8)
 ->setParameter('ulica', $ulica . '%')
 ->setMaxResults(1);

Przykład zapytania SQL z klauzulą LIKE i OR:
$qb = $this->createQueryBuilder('j')
 ->where('j.del = :del')
 ->andWhere('j.wysw = :wysw')
 ->andWhere('lower(j.nazw) LIKE lower(:szukana) OR lower(j.regon) LIKE lower(:szukana)')
 ->orderBy('j.nazw')
 ->setParameters(array(
  'del' => 'false',
  'wysw' => 'true',
  'szukana' => '%' . $szukana . '%'
 ));

return $qb->getQuery()->getResult();