雄辩的一对多关系

时间:2014-06-17 11:37:20

标签: laravel laravel-4 eloquent

我正在关注此处的信息:

http://laravel.com/docs/eloquent#one-to-many

我有资产和尺寸表。

资产有多种尺寸。

所以在我的资产模型中我有:

class Asset extends Eloquent {

    public function sizes()
    {
        return $this->hasMany('sizes');
    }

}

但是当我这样做时:

Asset::find(1)->sizes;

我明白了:

Class 'sizes' not found

我哪里错了?

迁移是:

Schema::create('assets', function($table){
        $table->increments('id');
        $table->string('title');
    });

    Schema::create('sizes', function($table){
        $table->increments('id');
        $table->integer('asset_id')->unsigned();
        $table->foreign('asset_id')->references('id')->on('assets');
        $table->string('width');
    });

我的类也是命名空间:

在我的控制器中:

<?php namespace BarkCorp\BarkApp\Lib;
use BarkCorp\BarkApp\Asset;

然后:

Asset::find(1)->sizes;

我的模特:

资产:

<?php namespace BarkCorp\BarkApp;

use \Illuminate\Database\Eloquent\Model as Eloquent;

class Asset extends Eloquent {

public function sizes()
    {
        return $this->hasMany('BarkCorp\BarkApp\Size');
    }

}

尺寸:

<?php namespace BarkCorp\BarkApp;

use \Illuminate\Database\Eloquent\Model as Eloquent;

class Size extends Eloquent {

}

1 个答案:

答案 0 :(得分:1)

您需要两者的模型,当您使用关系函数时,它将类名作为参数,而不是表的名称。函数名称可以是你想要的任何东西,所以你可以做任何有意义的事情。

class Size extends Eloquent {

    // This is optional for what you need now but nice to have in case you need it later
    public function asset()
    {
        return $this->belongsTo('Namespace\Asset');
    }
}

class Asset extends Eloquent {

    public function sizes()
    {
        return $this->hasMany('Namespace\Size');
    }
}

命名空间=您Asset模型上的命名空间。

$assetSizes = Namespace\Asset::find(1)->sizes;

或者您可以使用use,因此每次要使用Asset时都不需要添加命名空间。

use Namespace;
$assetSizes = Asset::find(1)->sizes;

或者你可以使用依赖注入。

public function __construct(Namespace\Asset $asset)
{
    $this->asset = $asset;
}

$assetSize = $this->asset->find(1)->sizes;