【问题标题】:Laravel eager loading resultLaravel 急切加载结果
【发布时间】:2013-05-28 07:26:40
【问题描述】:

我在 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);

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

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

..我觉得很难看。我觉得我应该只需要做类似的事情:

$page_data->translations->content;

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

是我遗漏了什么还是事情就是这样?

【问题讨论】:

    标签: laravel eager-loading laravel-3


    【解决方案1】:

    我觉得这里没有必要做预先加载。

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

    所以,我会这样做:

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

    然后

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

    然后,假设 pages_tl 表中存在 content 字段,我们将通过以下方式得到它:

    echo $page_data->content;
    

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

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

    【讨论】:

    • 我同意你的回答。也许这是一个例子,因为当你制作多语言的东西时,你不需要所有的语言,只需要用户的语言或当前的语言或其他语言。也许然后“with”方法不合适(还..)。代码给了我错误,因为我必须遍历关系数据,我认为是因为“has_many”关系。 (我对 Laravel 还很陌生,所以我可能对此有点不理解。)无论如何,感谢您的帮助!
    猜你喜欢
    • 2015-10-22
    • 2018-09-03
    • 2014-08-13
    • 2021-04-23
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多