我有以下表格:
**galleries**
id
location
open_to_public
**pictures**
id
title
published
**gallery_picture**
gallery_id
picture_id
这是我的画廊模型:
class Galleries extends Eloquent {
protected $table = 'galleries';
public function pictures(){
return $this->belongsToMany('pictures', 'gallery_picture', 'gallery_id', 'picture_id');
}
我正在尝试选择一个图库(ID,位置)并获取相关图片(ID,标题)。
首先,我尝试了这个,但它似乎返回了大量的数据,我不确定我是否正确的做法?
$this->mGalleries = new Galleries;
return $this->mGalleries->pictures();
我还想做的是为查询添加一些约束,我知道我可以这样做:
public function scopePublic()
{
return $query->where('open_to_public','=',1);
}
然后: 返回$ this-> mGalleries-> pictures() - > public();
但我尚未正确实施。有人能指出我正确的方向。
我想获得gallery.id,gallery.location和所有画廊图片,其中gallery.open_to_public = 1并且仅获取已发布的图片= 1.
此外,我希望获得与上述条件相关的所有画廊,而不仅仅是一个。
答案 0 :(得分:1)
如果没有您收到的具体错误,很难准确说出她的确切情况,但是从您的代码示例中突然发现的一件事是您不接受$query
作为参数你的范围方法。请尝试使用此代码:
public function scopePublic($query)
{
return $query->where('open_to_public','=',1);
}
除此之外,您似乎在错误的对象上调用了作用域函数。根据您的描述,您需要以下设置:
Gallery
(型号)
scopePublic($query)
Picture
(型号)
scopePublished($query)
此外,您只能一次性获取单个图库的图片,而不是所有图库。所以你不能像你期望的那样使用Gallery::all()->pictures
,而是你必须自己建立集合。
您的最终代码最终将如下所示:
// empty collection to store all our pictures
$pictures = new \Illuminate\Database\Eloquent\Collection;
// get all galleries open to the public
$galleries = Gallery::public()->get();
// for each gallery, get its pictures and add it to the collection
$galleries->each(function ($gallery) use ($pictures) {
$pictures->merge($gallery->pictures()->published()->get());
});
但是,有几种不同的方法可以做到这一点。您可能会发现预加载关系也有助于数据库查询(查找Eloquent的with()
,并查看是否有办法以某种方式传递范围调用)。或者,如果Eloquent的语法有点过于冗长,您可以尝试使用DB
类并手动加入。
另外,对不起,如果该代码有问题,它是未经测试的,但应该至少给你一个如何解决这个问题的基础。