2013-06-01 122 views
0

我有在laravelLaravel预先加载结果

与预先加载的麻烦我有这些模型:

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

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

这样做的两种方式将导致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做)

+0

我与你的答案一致。也许这是一个例子,因为当你制作多种语言的东西时,你不需要所有的语言,只需要用户语言或当前的语言。也许那么“与”方法是不适合的(但..)。代码给了我错误,因为我必须循环关系数据,我想是因为“has_many” - 关系。 (我对Laravel相当陌生,所以我可能会对此有点失望。)无论如何,感谢您的帮助! – Meddie

+0

很高兴帮助 - 我希望它实际上可以与你的例子一起工作。 – kJamesy