我试图根据数据透视表中的值从我的数据库中获取数据。
这些是我的表格:
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个上传。当我使用上面的查询时,它会返回所有上传内容,但电子邮件仅包含在匹配的数据透视网址中。但这不是我想要的,我只想上传一次。枢轴网址与我的值匹配的那个。
答案 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();
备注强>
当wherePivot
和orWherePivot
可用时,请参阅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