Is it? Is it not? “ORM is an anti-pattern” | Seldo.Com Blog

If you are into whether you’re going to use ORM in your next project or not, you’ll appreciate the thoughts about why and when ORM can be bad for the application. First its design flaws are shown and then alternatives are given. Too many queries, the need to break the abstraction by using raw queries, how bad it can be in the long term when it’s too late and many more:

ORM is an anti-pattern | Seldo.Com Blog.

I personally like ORM, defining the relations properly and then having the powerful code coming from this abstraction. I am on my way to use ORM in a big project too. I also know and use SQL a lot for example in data mappers. I think sometimes it may be better to create a custom in-house ORM for a project though this may require constant changes to it when adding new features. I also think that every query produced by the ORM should be checked before going in production and also using a monitoring tool for your application in prod and testing your application by overloading it in a dev environment is good.

Defining relationships among database tables with Eloquent @

One very clever article showing all types of complicated relations that you may stumble upon in your job.

The author shows in a very clean way how to create such migrations, seeds and models.

Check out how morphs(), morphTo(), morphToMany(), morphedByMany and withPivot() are used.

Read it a couple of times, test it with all possible databases Laravel supports and see the differences, check the structure created: tables, data, foreign keys. Add, delete records and see what happens inside the database. Try creating your own app using these functions to get even more clear picture.

Laravel, Eloquent, polymorphism, one-to-many, many-to-many and polymorphic many-to-many relationships:

Defining relationships among database tables with Eloquent.

Some PHP developer interview algorithms you must now



for ($i = 0; $i <= 30; $i++) {
    if ($i % 3 == 0 && $i % 5 == 0) {
        echo "$i: FizzBuzz; ";
    } elseif ($i % 3 == 0) {
        echo "$i: Fizz; ";
    } elseif ($i % 5 == 0) {
        echo "$i: Buzz; ";

Swap 2 vars values without using a third one:

Numbers and strings with XOR:


$a = 3;
$b = 5;

$a = $a+$b;
$b = $a-$b;
$a = $a-$b;

echo "a = $a; b = $b";



for ($i = 0; $i <= 30; $i++) {
    if ($i % 3 == 0 && $i % 5 == 0) {
        echo "$i: FizzBuzz; ";
    } elseif ($i % 3 == 0) {
        echo "$i: Fizz; ";
    } elseif ($i % 5 == 0) {
        echo "$i: Buzz; ";

Swap 2 strings without using XOR:

$a = 'texta';
$b = 'textb';
$a = $a . $b; //textatextb
$b = substr($a, 0, strlen($a) - strlen($b)); //texta
$a = substr($a, strlen($b)); //textb
echo "a = $a; b = $b";

PSR-0 & PSR-4 Autoloading

As of 2014-10-21 PSR-0 has been marked as deprecated. PSR-4 is now recommended as an alternative.

This citation is from here:

The PSR-0 Autoloading is now deprecated and we’re going to use only PSR-4 from now on.

Using namespaces and class names without checks if the file exists or looping through all of the files in many directories is way better!

PHP CompatInfo

Amazing tool to quickly check the minimum required PHP version of your application. You can also learn the new and deprecated things between the PHP versions while looking what is making your requirements too high, etc.

Don’t count 100% on it though. Running your unit tests with a couple of different PHP versions is also recommended.

PHP CompatInfo.

Docker image with Jenkins CI and full PHP configuration and tools

See it in action here.

Get the source from Github here.

This Docker image follows the configuration for installing Jenkins CI and the PHP testing tools.

It uses Ubuntu 14.04 LTS image.

The PHP 5.5 PPA by Ondřej Surý is used for the latest version of PHP and its extensions.

For Jenkins the Debian deb repo is used.

The deb is used for faster local updating/downloading of the apt packages.

DEBIAN_FRONTEND=noninteractive and apt-get -qq are used for automatic silent installs.

date.timezone=Europe/Sofia and ;disable_functions= are set in php.ini

After Jenkins is installed and needs its first update there is a wait of 60 seconds until the update script is called.

The Jenkins server is first updated before installing the plugins.

Currently these plugins are installed: checkstyle cloverphp crap4j dry htmlpublisher jdepend plot pmd violations xunit.

And these PHP testing tools are installed globally through Composer: phpunit/phpunit, squizlabs/php_codesniffer, phploc/phploc, pdepend/pdepend, phpmd/phpmd, sebastian/phpcpd, theseer/phpdox.

Composer installs the tools in /home/jenkins/.composer and makes all of them available globally in /usr/local/bin/.

Composer is set to use git to fetch the dependencies to avoid the GitHub API rate limits.

Port 8080 is exposed and available. This is the default Jenkins’ port.

The default CMD in the image is: “sh /”


First download the image:

docker pull iliyan/jenkins-ci-php:1.0.0

And run it:


docker run -d --name jenkins -p localhost:8080:8080 iliyan/jenkins-ci-php:1.0.0

Visible from outside on a hosting server:

docker run -d --name jenkins -p VISIBLESERVERPORT:8080 iliyan/jenkins-ci-php:1.0.0

Alternative usage of the PHP testing tools:

You can download all of the tools from your project’s composer.json file adding them for example in the dev secion like I did here and here.