Laravel Eloquent:在Eloquent中获取连接表的id字段

时间:2015-01-21 08:06:41

标签: php mysql laravel-4 eloquent

我需要获取第二张表的ID。我无法避免使用INNER JOIN,因为我必须通过第二个表中的列对结果进行排序。

这是我的2张桌子

events
  id
  name
  ....
  date
 ...
myevents
  id
  meeventID
  meresults
  ....

为了得到我想要的结果,我使用以下

$finishedRaces = Myevent::where('meuserID', $user->id)
  ->join('events', 'myevents.meeventID', '=', 'events.id')
  ->whereRaw("`events`.`date` >= '$signupday' AND `events`.`date` <= '$today'")
  ->orderBy('events.date','desc')->get(); 

如果我这样做

foreach($finishedRaces as $race){
  echo $race->id // this returns the id of the table events
}

我需要两个表的ID +两个表中的所有值总共约20个值。 有关如何做到这一点的任何想法? 我真的想避免使用->select("columnname as someothername, ..."),除非我只能定义2个id列,如果可能的话。

有些人要求添加

这里是相关的模型+功能

class Myevent extends Model{

    public function sportevent()
    {
            return $this->hasOne('Sportevent','id','meeventID');
    }

    public function athlete()
    {
        return $this->hasOne('User','id','meuserID');
    }

}

这里是Sportevent模型的一部分

class Sportevent extends Model{

    protected $table = 'events';
    // doesn't have a direct relation to Myevent model
}

这里是具有相关功能的用户模型

class User extends Model {

    public function myeventbydate($date){
        return $this->hasOne('Myevent','meuserID','id')
          ->join('events', 'myevents.meeventID', '=', 'events.id')
          ->where('events.date',$date)->get();
    }

    public function myevents($filter=""){
        if($filter==""){
            return Myevent::where('meuserID', $this->id)
              ->join('events', 'myevents.meeventID', '=', 'events.id')
              ->orderBy('events.date', 'desc')->first();    
        }else{
            return Myevent::where('meuserID', $this->id)
              ->join('events', 'myevents.meeventID', '=', 'events.id')
              ->where('events.country', $filter)
              ->orderBy('events.date', 'desc')->get();
        }   
    }
}

1 个答案:

答案 0 :(得分:5)

有时候解决方案比你想象的要容易。所以基本上我做的与我在标准SQL查询中所做的一样:SELECT *, myevents.id AS me_id FROM ... '然后看起来像这样:

$finishedRaces = Myevent::where('meuserID', $user->id)
        ->join('events', 'myevents.meeventID', '=', 'events.id')
        ->whereRaw("`events`.`date` >= '$signupday' AND `events`.`date` <= '$today'")
        ->select('*','myevents.id as me_id')
        ->orderBy('events.date','desc')->get();

我担心我必须在->select语句中指定每一列,但它的效果很好。

我的ID现在可以

访问
$race->me_id; // id of table myevents
$rade->id     // id of table events