2014-11-25 60 views
0

我有一个现有的数据库与一个相当糟糕的架构,我不能改变。我想通过Eloquent来使用它。在使用这个数据库时,我需要为所有查询添加几个关节,如下所示:如何在每个查询的默认情况下设置Eloquent中的连接?

<?php 
class SomeModel extends Eloquent { 

    protected $table  = 'users'; 
    protected $primaryKey = 'index'; 
    public $timestamps = FALSE; 

    function __construct($attributes = array()) 
    { 
     parent::__construct($attributes); 

     $this->leftJoin('sites', 'sites.Siteindex', '=', 'users.index'); 

     $this->leftJoin(DB::raw('(`lookups` `l`)'), function($join){ 
      $join->on('l.value', '=', 'users.type')->where('l.fieldname', '=', 'user_type'); 
     }); 
    } 
} 

是否有可能?

+0

什么是这两个表之间的关系类型的称呼呢? – phaberest 2014-11-25 12:38:47

+0

@phaberest没有真正的关系,只是一堆关节。 – user1692333 2014-11-25 12:40:07

+0

无论如何,你可以尝试使用'hasOne()'和'belongsTo()',但是你需要有两个模型,每个模型一个。在'User'模型中,使用名为'sites'的方法,并在其内部返回$ this-> hasOne('Site','sites','Siteindex');',在'Site'模型中做相反的操作,但是在'users'方法中有'return $ this-> belogsTo('User','users','index');''。 – phaberest 2014-11-25 13:01:30

回答

1

而不是在用户模型中使用__construct函数,创建一个范围。

public function scopeGetSiteIndex($query) { 
    return $query->leftJoin('sites', 'sites.Siteindex', '=', 'users.index'); 
} 

然后你可以从控制器

$siteIndex = User::getSiteIndex()->get(); 
+1

当使用'连接'时,请记得也使用'select',否则连接表的'id'将覆盖主表的'id',您将体验意外的行为。 – 2014-11-25 15:50:41

+0

不知道为什么,但像这样paginate的方式返回空数据... – user1692333 2014-11-26 07:01:32

+0

我有与paginate相同的问题。我通过从Laravel 4.2.11恢复到4.2.0来修复它。它必须是一个错误。 – Robbie 2014-11-27 03:05:35