Question

So I've got three models, "Incomplete", "User", and "Collaboration". They are related with foreign keys as such:

Collaboration->incomplete_id
incomplete_id->Incomplete
Incomplete->user_id
user_id->User

If I want to get the email of a user for a Collaboration model I have the following code

User::find(Incomplete::find($collab->incomplete_id)->user_id)->email);

I feel like this is wrong as I'm not joining any tables but I don't want to break out of mvc and call straight up SQL from the controller. Basically I'm curious how I could do this correctly.

Collaboration Model

class Collaboration extends Eloquent{
//Set the database to connect to as form d
protected $connection = 'formd';

//Set the table for the model to incomplets
protected $table = 'collaborations';

//Set the fillable columns
protected $fillable = array('incompid', 'link', 'shareFlag');


private $rules = array(
    'link'=>'required|unique:collaborations|size:56',
    'incompid'=>'required|integer'

);

private $errors;

public function validate($data)
{
    // make a new validator object
    $v = Validator::make($data, $this->rules);

    // check for failure
    if ($v->fails())
    {
        // set errors and return false
        $this->errors = $v->errors();
        return false;
    }

    // validation pass
    return true;
}

public function errors()
{
    return $this->errors;
}

public function getId(){
    return $this->getKey();
}

public function incomplete(){
    return $this->hasOne('Incomplete');
}   

}

Incomplete Model

class Incomplete extends Eloquent{
//Set the database to connect to as form d
protected $connection = 'formd';

//Set the table for the model to incomplets
protected $table = 'incompletes';

//Set the fillable columns
protected $fillable = array('name', 'data', 'userid');


private $rules = array(
    'name' => 'required|min:3',
    'data' => 'required'

);

  private $errors;

public function validate($data)
{
    // make a new validator object
    $v = Validator::make($data, $this->rules);

    // check for failure
    if ($v->fails())
    {
        // set errors and return false
        $this->errors = $v->errors();
        return false;
    }

    // validation pass
    return true;
}

public function errors()
{
    return $this->errors;
}

public function getId(){
    return $this->getKey();
}

public function getData(){
    return $this->data;
}

public function getName(){
    return $this->name;
}


public function user(){
    return $this->hasOne('User');
}   

}
Was it helpful?

Solution

You can use Eloquents relations: http://laravel.com/docs/eloquent#relationships

class Collaboration extends Eloquent {

    public function incomplete()
    {
        return $this->hasOne('Incomplete', 'incomplete_id', 'id');
    }

}

You can then get the data from the incomplete record by doing:

$collab->incomplete->user_id

OTHER TIPS

In this case, use a relation on your models:

class Collaboration extends Eloquent {

public function incomplete()
{
    return $this->belongsTo('Incomplete', 'incomplete_id');
}}

And

class Incomplete extends Eloquent {

public function user()
{
    return $this->belongsTo('User', 'user_id');
}}

Then, do this:

Collaboration::find($id)->incomplete()->user()->email;

first of all you'll have to update parts of your model class

    Class Collaboration extends Eloquent{
      protected function incomplete(){
        return $this->belongsTo('Incomplete');
      } 
    }
    Class Incomplete extends Eloquent{
      protected function collaboration(){
        return $this->hasOne('Collaboration');
      }
      protected function user(){
        return $this->belongsTo('User');
      }
    }
    Class User extends Eloquent(){
      protected function incomplete(){
        return $this->hasOne('Incomplete');
      }
    }

Then inorder to get what your want, here is the query

Collaboration::find($id)->incomplete()->user()->email;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top