关系和条款?

时间:2014-02-12 12:03:37

标签: laravel laravel-4 eloquent

我有以下表格:

**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.

此外,我希望获得与上述条件相关的所有画廊,而不仅仅是一个。

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类并手动加入。

另外,对不起,如果该代码有问题,它是未经测试的,但应该至少给你一个如何解决这个问题的基础。