Max Frai
Max Frai

Reputation: 64266

Cakephp and database with uncomon structure

how can I access any table from database in my model?

For example, I have Indexcontroller and code inside it:

$results = $this->Index->query("SELECT COUNT(*) FROM my_own_table");


Error: Database table indices for model Index was not found.

So, as I understand, I can access only table with naming related to model/controller name. But what to do if I can't modify the table naming and I want to access it's data?

Upvotes: 1

Views: 206

Answers (2)

leemeichin
leemeichin

Reputation: 3379

You're not limited to using a model that's directly associated with your controller (this is just default behaviour); you can use any model.

To achieve what you want, create a new model for this table, eg. MyOwnTable, and in your controller, you can add this property to the class:

public $uses = array('Index', 'MyOwnTable');

Now you can access MyOwnTable using CakePHP's built in ActiveRecord functionality:

$results = $this->MyOwnTable->find('count');

If you have other tables you want to access, simply create models for those and add them to the $uses property. (You can also use $this->loadModel('Model') inside the action if you prefer).

If you have a table name that isn't very readable (eg. my_tb_own_1_x or some such), you can call the model class something human readable (eg. MyTable), and add the $useTable property to the model:

public $useTable = 'my_tb_own_1_x';
/* and change the default primary key if you have an unusual one */
public $primaryKey = 'my_tb_own_1_x_idx_pk';

See the CakePHP manual for more info on how to change default model and controller behaviour:

1.3 - Model Attributes

2.0 - Model Attributes

1.3 - Controller Attributes

2.0 - Controller Attributes

Upvotes: 1

Joep
Joep

Reputation: 651

Nope. You can access different tables. However, CakePHP stumbles over the fact that the table that is associated by default to the Index model doesn't exist.

In other words, the model Index expects a table 'indices' to exist (and an error is thrown when it doesn't). You can do one of two things:

  1. Create a table indices
  2. Add the following to your Index model: var $useTable = false;

If you have any use for an indices table I'd go with option 1. If you're not going to use the indices table, go with option 2.

If you go with either step 1 or 2, your example should start working.

Upvotes: 0

Related Questions