Search code examples
laminas

Custom table name for a model in laminas


I've started learning laminas by reading it's documentation (Album model and table). I have a product model and I want to fetch the records but the problem is that the name of my table is tbl_product and I get this error:

Statement could not be executed (42S02 - 1146 - Table 'project.product' doesn't exist)

Where can I define the table name?


Solution

  • Supposing that by "reading it's documentation" you are talking about Laminas' tutorial, then the answer can be found under the the Database and Models section

    When you define a new model, you must update the module's configuration, specifying where the application will find the model's factory and gateway:

    // Add this method:
    public function getServiceConfig()
    {
        return [
            'factories' => [
                Model\AlbumTable::class => function($container) {
                    $tableGateway = $container->get(Model\AlbumTableGateway::class);
                    return new Model\AlbumTable($tableGateway);
                },
                Model\AlbumTableGateway::class => function ($container) {
                    $dbAdapter = $container->get(AdapterInterface::class);
                    $resultSetPrototype = new ResultSet();
                    $resultSetPrototype->setArrayObjectPrototype(new Model\Album());
                    return new TableGateway('album', $dbAdapter, null, $resultSetPrototype);
                },
            ],
        ];
    }
    

    The class that contains the db table information is TableGateway, which constructor is:

    public function __construct(
        $table,
        AdapterInterface $adapter,
        $features = null,
        ?ResultSetInterface $resultSetPrototype = null,
        ?Sql $sql = null
    )
    

    The first parameter is the table's name.
    Hence, in your configuration, you need something like:

    Model\ProductTable::class => function($container) {
        $tableGateway = $container->get(Model\ProductTableGateway::class);
        return new Model\ProductTable($tableGateway);
    },
    Model\ProductTableGateway::class => function ($container) {
        $dbAdapter = $container->get(AdapterInterface::class);
        $resultSetPrototype = new ResultSet();
        $resultSetPrototype->setArrayObjectPrototype(new Model\Product());
        return new TableGateway('tbl_product', $dbAdapter, null, $resultSetPrototype);
    },