在Laravel之外使用Eloquent - Eager / Lazy Loading相关模型

时间:2013-12-10 09:55:07

标签: wordpress laravel lazy-loading eloquent eager-loading

我在wordpress插件中使用Laravel的Eloquent。

产品型号:

<?php namespace GD;

use Country;

class Product extends \Illuminate\Database\Eloquent\Model
{
    public function country()
    {
        return $this->belongsTo('Country', 'CountryId');
    }
}

国家模型:

<?php namespace GD;

use Product;

class Country extends \Illuminate\Database\Eloquent\Model
{
    public function products()
    {
        return $this->hasMany('Product');
    }
}

我可以使用标准的Laravel语法查询任何模型:

$products = $this->product->where('MetalId', '=', 1)
->where('ProductTypeId', '=', '2')
->orderBy('Name')->orderBy('CountryId')
->get();

然而,我无法急切/懒惰加载相关模型:

$products = $this->product->with('country')->where('MetalId', '=', 1)
->where('ProductTypeId', '=', '2')
->orderBy('Name')->orderBy('CountryId')
->get();

错误消息

Fatal error: Class 'Country' not found in .../vendor/illuminate/database/Illuminate/Database/Eloquent/Model.php on line 593

所以我认为这必须是命名空间问题,因此我将我的模型代码更新为:

return $this->belongsTo('\\GD\\Country', 'CountryId');

and

return $this->hasMany('\\GD\\Product');

但是,当我在产品模型上运行查询并对结果进行vardump时,我得到:

  ["relations":protected]=>
  array(1) {
    ["country"]=>
    NULL
  }

1 个答案:

答案 0 :(得分:1)

我最近遇到了同样的问题,这确实是命名空间问题。

尝试仅向命名空间字符串添加单个反斜杠,因为您使用单引号将它们括起来。

像这样:

return $this->belongsTo('GD\Country', 'CountryId');

and

return $this->hasMany('GD\Product');

另外,请确保您使用完整的命名空间。在我的应用程序中,我使用了'App \ Models \ ModelName'。

你的应用应该是'App \ Models \ GD \ ModelName'吗?这取决于您的申请结构。

让我知道这是否有效。