5
votes

I have two table 'login' and 'profile'. login table contains user_id, username, password, type. profile table contains profile_id, user_id, name, address, phone_no,email,status,pancardno,gender,birthday,joiingdate,endingdate. Here i have use user_id as reference key.Form contains username,password,type,name,address,phone number. So how can i insert username,password,type in 'login' table and ohter field in profile table in Zend Framework.
Here is my controller code.

include_once(APPLICATION_PATH.'/modules/admin/models/DbTable/Login.php');
public function emppostAction()
{
$session=new Zend_Session_Namespace();
if(isset($session->id))
{
$this->view->name="<b>".$session->name."</b>";
$this->render('employee');

          $data= new Model_DbTable_Login();
          if($this->getRequest()->isPost())
          {
              $un=$this->getRequest()->getPost('un');
              $name=$this->getRequest()->getPost('name');

              $bday=$this->getRequest()->getPost('bday');
              $bmnth=$this->getRequest()->getPost('bmonth');
              $byear=$this->getRequest()->getPost('byear');                   
              $bdate=$byear."-".$bmnth."-".$bday;         

              $jday=$this->getRequest()->getPost('jday');
              $jmnth=$this->getRequest()->getPost('jmonth');
              $jyear=$this->getRequest()->getPost('jyear');
              $jdate=$jyear."-".$jmnth."-".$jday;

              $eday=$this->getRequest()->getPost('eday');
              $emnth=$this->getRequest()->getPost('emonth');
              $eyear=$this->getRequest()->getPost('eyear');                   
              $edate=$eyear."-".$emnth."-".$eday;

              $phoneno=$this->getRequest()->getPost('phoneno');
              $add=$this->getRequest()->getPost('add');   
              $qf=$this->getRequest()->getPost('qf');
              $jod=$this->getRequest()->getPost('jod');
              $email=$this->getRequest()->getPost('email');
              $pwd=$this->getRequest()->getPost('pwd');
              $gn=$this->getRequest()->getPost('gender');
              $ms=$this->getRequest()->getPost('ms');
              $desg=$this->getRequest()->getPost('desig');
              $status=$this->getRequest()->getPost('status');
              $pan=$this->getRequest()->getPost('pancard');


              $insert=$data-> >insertData($un,$pwd$name,$bdate,$phoneno,$add,$qf,$jdate,$edate,$gn,$ms,$desg,$email,$pan,>$status);

          $this->_helper->redirector('viewemp', 'Leave');
              exit;   

          }               
      }
      else
      {
          $this->_helper->redirector('login','index');
      }       

}

In model i have

class Model_DbTable_Login extends Zend_Db_Table_Abstract
{
public function insertData($un,$pwd)

{
$data = array(
'username'=> $un,
'password'=> $pwd
);
$data2 = array( 'name'=> $name, 'birthdate'=> $bdate, 'phoneno'=> $phoneno, 'address'=> $add, 'qualification'=> $qf, 'joiningdate'=> $jdate, 'endingdate'=> $edate, 'gender'=> $gn, 'maritalstatus'=> $ms, 'designation'=> $desg, 'email'=> $email, 'pancardno'=>$pan, 'status'=> $status );

  try{  
                  //here i m inserting data in login table.
      $result=$this->insert($data);
                   // now here i want to insert data in profile table
                   $profile=$this->insert($data2)
  }  

catch(exception $e){
echo "
".$e;exit;
}
}

So how to insert data in profile table while inserting data in login table?

2
Is the relationship between login and profile 1:1? If so, wouldn't it be more logical to merge them in this case? - Liyali
is there a reason to have a profile_id and a user_id. Wouldn't it be easier for both tables to index to user_id? The login table would have the user_id as self incrementing and the profile table would use user_id as a natural(assigned not auto incrementing) key. Unless you're allowing users to have multiple profiles. - RockyFord
@Rocky Ya thanx Rocky Ford. There is no need of profile_id. But i can't get the ans of my question. Can u help me in this question? How to insert data in login table and profile table. I can insert data in login table but not in profile table. - Jigar Gorakhiya

2 Answers

2
votes

ok Jigar let me dumb this down to my level (I think you're probably close to me).

You need a DbTable model for each table you intend to use in the app.

minimum requirements for dbTable model(All classes use ZF 1.11 default names and paths):

class Application_Model_DbTable_Login extends Zend_Db_Table_Abstract
{
    //$_name = name of table, not reuired if classname = tablename, but good idea
    protected $_name = 'login';
    //$_primary = primary key column of table, good idea for easy reference.
    protected $_primary = 'user_id';

    //save function added for brevity
    //I like to use the save() method over insert() because for a single row 
    //I can save and update with the same method...easily.
 public function saveUser(array $data) {
    //convert array to standard object for convience
    $dataObject = (object) $data;
    //check if user_id array key exists and isset in original data, if exist will update
    if (array_key_exists('user_id', $data) && isset($data['user_id'])) {
        $row = $this->find($dataObject->id)->current();
    } else {
        //if user_id not set or present in array we create a new row
        $row = $this->createRow();
    }

    $row->username = $dataObject->username;
    $row->password = $dataObject->password;
    $row->type     = $dataObject->type;
    //save or update row
    $row->save();
    //return the whole row object, we'll use it to save data to 'profile'
    return $row;
  }
}

//I would change the profile table to use the user_id as a 'natural' key, this requires adding
//a third property $_sequence = false.
class Application_Model_DbTable_Profile extends Zend_Db_Table_Abstract
{
    //$_name = name of table, not reuired if classname = tablename, but good idea
    protected $_name = 'profile';
    //$_primary = primary key column of table, good idea for easy reference.
    protected $_primary = 'user_id';
    //primary key auto-increment? True for yes false for natural key
    protected $_sequence = FAlSE;

    public function saveUserProfile(array $data, $id) {
    //convert array to standard object for convience
    $dataObject = (object) $data;
    //the user_id will always exist when we deal with the profile
    $row = $this->find($id)->current();
    if (!row)) {
        $row = $this->createRow();
        $row->user_id  = $id;
    } 

    $row->name      = $dataObject->name;
    $row->address   = $dataObject->email;
    $row->phone     = $dataObject->phone;//continue adding fields
    //save or update row
    $row->save();
    //return the whole row object, we'll use it to save data to 'profile'
    return $row;
  }
 }
}

now for a simple controller action to aquire the data we want saved. We'll use the default IndexController/indexAction for example.

class IndexController extends Zend_Controller_Action {


    public function indexAction() {
        $form = new Form(); //add your form here
        //this assumes the use of a Zend_Form object. For other form types use $this->getRquest()->getParams();
        if ($this->getRequest()->isPost() {
            if ($form->isValid($this->getRequest()->getPost()){
            $formData = $form->getValues(); //returns array of filtered/validated form values
           $model = new Application_Model_DbTable_Login();
           //pass the whole array to the saveUser() correct the data in the model.
           $user = $model->saveUser($formData);
           //$user returns the row object we just saved
           $profile = new Application_Model_DbTable_Profile();
           $profile->saveUserProfile($formData, $user->user_id);
      }
    }
    //assign form to view
    $this->view->form = $form;
  }
}

This is simple example that by no means conforms to best practices, but the technique works. The code pattern present in indexAction() will become very familiar if you work with a number of forms.

I would probably combine the two DbTable calls in the controller into a third model called for example: Application_Model_User.

The thing to remember here is : Filter and Validate user data in the view/controller and then normalize your data in your models. You can pass the same array of data wherever you want and just extract a bit here and a bit there.

Rob's answer is way more correct then mine, but it does contain concepts that some of us amature/beginner programmers don't quite grok yet. :)

Good Luck.

1
votes

Create a User entity that holds all the properties needed from both tables. Also create a service object that you use to load and save User entities.

The server object, say UserService, should then have two properties for each table. You can do this with two mapper objects that you write, or you could use two Zend_Db_Table objects.

Write a method on UserService called SaveUser($user) which then extracts the correct properties for each table and calls the relevant table object to do the insertion or update.

Similarly, create a UserService::LoadUser($id) which allows you to instantiate a User entity and fill in its properties from the two table gateway objects.

Here's some sample code that shows the ideas I mean. Obviously it's not production ready!

<?php

class User {
    public $user_id;
    public $username;
    public $password;
    public $profile_id;
    public $name;
    public $address;
    public $phone_no;

}

class LoginTable extends Zend_Db_Table_Abstract
{
    protected $_name = 'login';
}

class ProfileTable extends Zend_Db_Table_Abstract
{
    protected $_name = 'profile';
}

public UserService
{
    public function saveUser(User $user)
    {
        $loginTable = new LoginTable();
        $profileTable = new ProfileTable();

        $loginData = array(
            'username' => $user->username,
            'password' => $user->password,
        );
        $profileData = array(
            'user_id' => $user->user_id,
            'name' => $user->name,
            'address' => $user->address,
            'phone_no' => $user->phone_no,
        );

        if (!user->user_id > 0) {
            // updating
            $loginTable->update($loginData, 'user_id = '. (int)$user->user_id);
            $profileTable->update($profileData, 'profile_id = '. (int)$user->profile_id);
        } else {
            // inserting
            $user->user-id = $loginTable->insert($loginData);
            $profileData['user_id'] = $user->user_id;
            $profileTable->insert($profileData);
        }
    }
}