Laravel渴望加载结果

时间:2013-06-01 16:35:26

标签: laravel eager-loading laravel-3

我在laravel中急切加载时遇到了麻烦

我有这些模特:

class Page extends Eloquent {

    public function translations() {
        return $this->has_many('Pagestl', 'page_id');
    }
}

class Pagestl extends Eloquent {

    public static $table = 'pages_tl';

    public function page() {
        return $this->belongs_to('Page', 'id');
    }
}

我想要一个特定页面,其中包含特定语言的翻译数据。 我检索这样的数据:

$page_data = Page::with(array('translations' => function($query) {
    $query->where('lang_id', '=', 'nl')->first();
}))->find($id);

结果是好的。我得到了所有的页面数据和1种语言的翻译,荷兰语(nl)。但是为了从语言数据中得到一个字段,我必须这样做:

$page_data->translations[0]->attributes['content_or_whatever'];

..我觉得很难看。我觉得我应该只做一些事情:

$page_data->translations->content;

..但是这给了我一个错误(试图获取非对象的属性)。

我错过了什么,或者这就是它的方式?

1 个答案:

答案 0 :(得分:1)

我认为没有必要在这里进行急切加载。

这两种方式都会产生2个查询:选择具有给定ID的页面,然后找到它的第一个翻译。

所以,我会这样做:

$page = Page::find($id);

然后

$page_data = Pagestl::where_page_id_and_lang_id($page->id, 'nl')->first();

然后,假设内容字段存在于 pages_tl 表中,我们将通过以下方式获取:

echo $page_data->content;

最后,你的代码看起来还不错;在定义关系时,您不必拥有第二个参数,除非它们与Laravel期望的不同。

我会让你找到你的代码问题所在(我无法从给出的信息中找出 - 可能与strings.php有关)