JSON serializationMemory management and batches processing

Miscellaneous features

Deleting beans

Each DAO comes with a delete method to delete beans from the database.


When delete is called on a bean, the many-to-many relationships are automatically deleted as well.

Cascading deletes

The delete method accepts a second $cascade parameter, that can be set to true is you want to perform cascade delete operations.

// Delete $user and any bean that is pointing to the user.
$userDao->delete($user, true);

When using "cascading delete", any bean pointing to the deleted bean will be deleted as well.

Discarding changes on a bean

If your bean is coming from database, you can at any time cancel any changes you performed using the discardChanges method.

$user = $userDao->getById(1);

echo $user->getName();
// outputs 'Foo'


// Cancels any changes

echo $user->getName();
// outputs 'Foo' again, not 'Bar'

Cloning beans

You can clone beans using the clone keyword.

$user = $userDao->getById(1);

$userCopy = clone $user;

Cloned beans have the following properties:

  • The primary key of the cloned bean is set to null. This enables you to save the cloned bean easily (if you use auto-incremented primary keys).
  • The cloned bean is "detached" from TDBM. You will have to call the save method of the DAO to save the bean in database.
  • Many to many relationships are also passed to the cloned bean.

Mapping result sets

Please notice that result sets have a very useful map method.

Let's say you want to build an array of all your users first name:

$users = $userDao->findAll();

// The callback passed to the map function will be called once for each record in the recordset.
// You will get in $firstNames an array containing the list of callback results.
$firstNames = $users->map(function(UserBean $user) {
    return $user->getFirstName();

Logging and debugging

TDBM uses MagicQuery to automatically guess the joins you want. If for some reason, the guess is bad, it can be quite difficult to understand the request performed.

In these cases, you will want to enable logging.

For this, you need to pass a PSR-3 compatible logger as the 4th parameter of the TDBMService constructor.

TDBM can log quite a lot so by default, TDBM will restrict itself to only logging "warning" messages (or above). If you enable logging of "debug" messages, you will see any SELECT request performed by TDBM.

For instance, to log a specific SQL request, you can do:

class UserDao extends UserBaseDao {

     * Returns the list of users starting with $firstLetter
     * @param string $firstLetter
     * @return UserBean[]
    public function getUsersByLetter($firstLetter) {
        return $this->find("name LIKE :name", [ "name" => $firstLetter.'%' ]);

Do not forget to register a PSR-3 logger in your TDBMService, otherwise, nothing will be logged!

JSON serializationMemory management and batches processing

Found a typo? Something is wrong in this documentation? Just fork and edit it!