根据数据透视表获取结果

时间:2014-04-24 07:36:20

标签: php laravel eloquent

我试图根据数据透视表中的值从我的数据库中获取数据。

这些是我的表格:

uploads
-> id
-> name
-> type

emails
-> id
-> email


upload_emails
-> id
-> upload_id
-> email_id
-> url

现在举例来说,我有以下网址:1234

如何选择附加到数据透视表'upload_email'的上传内容 其中数据透视表中的网址值与1234

匹配

我有以下

Upload::emails()->wherePivot('url', $key)->get();

但那根本不起作用。我确实在我的模型中建立了关系......

编辑:

在建议的答案之后,我非常接近。这就是我现在所拥有的:

return Upload::with(array('emails' => function($query) use ($key) {
    $query->wherePivot('url', $key);
}))->get();

我的数据库中有9个上传。当我使用上面的查询时,它会返回所有上传内容,但电子邮件仅包含在匹配的数据透视网址中。但这不是我想要的,我只想上传一次。枢轴网址与我的值匹配的那个。

3 个答案:

答案 0 :(得分:0)

使用with方法的急切加载约束可能是您所需要的:

Upload::with('email', function($q) use($key) {
  $q->where('url', $key);
})->get();

查看the docs了解详情。

答案 1 :(得分:0)

试试这个:

$upload = Upload::with(array('email' => function($query) use ($key) {
   // where is URL in the table? shouldn't it be 'key'?
   $query->where('key', $key); 
}))->get();

备注

wherePivotorWherePivot可用时,请参阅here

您必须在关系中添加其他列,如下所示:

public function emails(){
    return $this->belongsToMany(...)->withPivot("key");
}

据说,使用Laravel 4.1,您可以为模型添加另一种方法:

$upload = Upload::emails()->wherePivot('key', $key)->get();

答案 2 :(得分:0)

根据您的表格,您只需要解决这个问题:

Upload::emails()->wherePivot('url', $key)->get(); // no url field on that table!
// change to:
Upload::find($id)->emails()->wherePivot('key', $key)->get();
// or if you want a collection then:
Upload::with(array('emails'=> function ($q) use ($key) {
   $qwherePivot('key', $key);
}))->get();

// to fetch only those Upload models that have related email matching given 'key'
Upload::whereHas('emails', function ($q) use ($key) {
   $q->where('upload_emails.key', $key);
})->get(); // add the above with(...) method to also load those emails