Showing posts with label foreign key. Show all posts
Showing posts with label foreign key. Show all posts

Sunday, June 20, 2010

Yii + MySql + Wamp







First, I installed WampServer, which is a package of Apache, Php and MySql coupled into one. In the httpd.conf file I pointed the “DocumentRoot” and “Directory” configurations to the directory, where I would have my application and Yii framework.


I copied the Yii framwork in "d:/workspace/app_demo/”

To create the stub application from yii, I executed these commands for my setup:

>cd D:\workspace\app_demo

>yii\framework\yiic webapp myapp

-------

This created an application “myapp” under “app_demo” folder.

The “/app_demo/myapp/protected/config/main.php” file contains the database configurations. By default the database was pointed to an sqlite database. I changed that, to point to Mysql database. So I had these settings for my mysql database.

/* 'db'=>array(

'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/testdrive.db',

),*/

'db'=>array(

'connectionString' => 'mysql:host=localhost;dbname=pages_db',

'emulatePrepare' => true,

'username' => 'root',

'password' => '',

'charset' => 'utf8',

),

I also enabled logging through this file to look like this:

'log'=>array(

'class'=>'CLogRouter',

'routes'=>array( array('class'=>'CFileLogRoute',

'levels'=>'error, warning',

),

array('class'=>'CWebLogRoute',

), ), ),

-------

My database had two tables (user and address). The sql is shown below:

CREATE TABLE IF NOT EXISTS `address` (

`addressid` int(11) NOT NULL AUTO_INCREMENT,

`firstline` varchar(45) DEFAULT NULL,

`secondline` varchar(45) DEFAULT NULL,

`city` varchar(45) DEFAULT NULL,

`state` varchar(45) DEFAULT NULL,

`country` varchar(45) DEFAULT NULL,

PRIMARY KEY (`addressid`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `user` (

`userid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'This contains the userid of the user',

`fname` varchar(128) NOT NULL COMMENT 'This contains the first name of the user',

`lname` varchar(128) DEFAULT NULL COMMENT 'This contains the last name of the user',

`sex` varchar(1) NOT NULL COMMENT 'This contains the sex of the user',

`age` int(100) DEFAULT NULL COMMENT 'This contains the age of the user',

`creation_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'This contains the user account creation',

`user_addressid` int(11) DEFAULT NULL,

PRIMARY KEY (`userid`),

KEY `fk_user_address` (`user_addressid`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `user` ADD CONSTRAINT `fk_user_address` FOREIGN KEY

(`user_addressid`) REFERENCES `address` (`addressid`) ON DELETE NO ACTION ON

UPDATE NO ACTION;

-------

I had to create corresponding models for the tables. After the database configuration, I ran the following commands to create the models in my app.

cd app_demo\myapp

D:\workspace\app_demo\myapp>protected\yiic shell index.php

This opened the Yii Interactive Tool.

Yii Interactive Tool v1.1 (based on Yii v1.1.2)

Please type 'help' for help. Type 'exit' to quit.

>> model *

The following model classes (tables) match your criteria:

1. Address (address)

2. User (user)

Do you want to generate the above classes? [Yes|No] yes

generate models/Address.php

generate fixtures/address.php

generate unit/AddressTest.php

generate models/User.php

generate fixtures/user.php

generate unit/UserTest.php

The following model classes are successfully generated:

Address, User

If you have a 'db' database connection, you can test these models now with:

$model=User::model()->find();

print_r($model);

-------

After this, I edited the actionIndex function in SiteController.php to look like this:

public function actionIndex()

{

// renders the view file 'protected/views/site/index.php'

// using the default layout 'protected/views/layouts/main.php'

$this->render('index', array(

'user' => User::model()->findAll()

));

}

In the index.php, I added the following table to display the records from the database:

 
foreach($user AS $us):?> 
 echo $us->fname;?> 
echo $us->lname;?> 
echo $us->age;?> 
echo $us->user_address->city;?> 
 endforeach;?>

Then I pointed my browser to http://localhost/myapp/index.php and this generated a table with the results.

More on this later...