雄辩如何与关系一起工作?

时间:2015-02-12 03:52:00

标签: mysql laravel laravel-4 relationship

我是laravel关系的新手,如果这只是一个愚蠢的问题,很多人道歉。我在项目中使用名为users_email的数据透视表来获取用户的电子邮件。数据透视表包含外键Uid和Email_id。 Uid引用用户表 主键和Email_id相同。我可以使用QueryBuilder加入它们时获得结果。

 $recent_inbox_email=DB::table('users_email')->
                join('email','users_email.email_id','=','email.Id')->
                join('users','users_email.Uid','=','users.Id')->
                where('users_email.Uid','=',$Uid)->
                where('email.draft','<>','true')->
                where('email.trash','<>','true')->
                where('email.status','=','unread')->count();

这是我在模型中定义关系的方法

   public function getUid()//User Model
    {   
        return $this->hasMany("User_Email",'Uid');
    }

   public function getEmId()//Email Model
    {   
        return $this->hasMany("User_Email",'email_id');
    }
   //User_Email Model
    public function email()
   {
     return $this->belongsTo('Email','Id','email_id');
   }
   public function user()
  {
    return $this->belongsTo('User','Id','Uid');
  }

现在我想使用Eloquent

查询这样的内容
    $query= select * from users_email inner join  
     email on users_email.email_id=email.Id
     inner join users on users_email.Uid=users.Id
     where users.Id=users_email.Uid limit 0,10

     foreach($query as $emails)
     {
      echo  $emails->f_name;
      echo $emails->Message
     }

数据库设计师Pic Link to image

由于

1 个答案:

答案 0 :(得分:3)

没有愚蠢的问题。我会尽力给你一个解释!我不是专业人士,但也许我可以提供帮助。 Laravel使用了一些非强制性的约定,但是如果你使用它们,那就像魅力一样。 例如,作为一般建议,表格应以复数形式命名(您的表格用户可以。您的“电子邮件”表格应为“电子邮件”)。该模型应以单数命名。这是表用户的User.php,表电子邮件的Email.php。 “数据透视表是从相关模型名称的字母顺序派生出来的......”,在本例中为“email_user”。我再说一遍,你没有义务像这样命名它们,因为你可以为模型中的$ table属性指定模型表。 设置完这样的内容后,您只需将其添加到用户模型中:

public function emails()
{
    return $this->belongsToMany('Email');
}

在您的电子邮件模型中:

public function users()
{
    return $this->belongsToMany('User');
}

括号内的“用户”和“电子邮件”是相关模型的名称。

就是这样。你现在可以这样做:

$user = User::find(1);
foreach($user->emails as $email) {
    echo $email->subject . '<br>';
    echo $email->message . '<br>';
}

如果您决定不遵守惯例,您仍然可以使用Eloquent关系。你必须建立这样的关系:

public function nameOfRelation()
{
    return $this->belongsToMany('NameOfRelatedModel', 'name_of_table', 'foreign_key', 'other_key');
}

例如,对于User模型:

    public function emails()
    {
        return $this->belongsToMany('Email', 'users_email', 'Uid', 'email_id');
    }

在电子邮件模型中,反过来说。 答案很长!我没有测试代码,但这应该给你一个想法! 您可以随时查看Laravel官方文档,这真的很有帮助! http://laravel.com/docs/4.2/eloquent

希望我帮助