首页 文章

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

提问于
浏览
1

我是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 回答

  • 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关系 . 你必须 Build 这样的关系:

    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

    希望我帮忙

相关问题