构建使用模型关系检索数据的菜单

时间:2014-03-19 15:55:09

标签: php laravel model relationship

我正在尝试使用模型关系构建菜单。菜单项是类别和产品。我想列出一个类别列表,其中每一行都列出了他们自己的产品。我担心我错过了这个的全部逻辑。

我的第一个模特:

class Categoria extends Eloquent {

    protected $table = 'categorie';

    public function prodotti()
    {
        return $this->hasMany('Prodotto','categoria_id');
    }
}

我的第二个模特:

class Prodotto extends Eloquent {

    protected $table = 'prodotti';

        public function categoria()
        {
            return $this->belongsTo('Categoria', 'categoria_id');
        }

} 

'categorie'表格字段为:

('id', 'nome', 'descrizione'...)

'prodotti'表格字段为:

('id', 'categoria_id', 'codice'...)

我的控制器是:

class SiteController extends BaseController {


    public function menuHome()
    {
        $categorie = Categoria::where('attivo', '=', '1')->orderBy('nome','asc')->get();

        $prodotti = Categoria::find(1)->prodotti()->get();

        return View::make('index')
        ->with('categorie',$categorie)
        ->with('prodotti',$prodotti);
    }
}

迁移是:

1)

class CreateCategorie extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('categorie', function($table)
        {
            $table->increments('id')->unsigned();
            $table->string('nome', 255);
            $table->text('descrizione')->nullable();
            $table->boolean('attivo')->default(false);
            $table->timestamps();
        });

    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('categorie');
    }

}

2)

class CreateProdotti extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('prodotti', function($table)
        {
            $table->increments('id')->unsigned();
            $table->integer('categoria_id')->unsigned();
            $table->foreign('categoria_id')->references('id')->on('categorie');
            $table->string('codice', 255)->nullable();
            $table->string('produttore', 255);
            $table->string('modello', 255);
            $table->text('descrizione')->nullable();
            $table->string('tipo', 255)->nullable();
            $table->string('lungmax', 255)->nullable();
            $table->string('peso', 255)->nullable();
            $table->string('certificazioni', 255)->nullable();
            $table->string('prove', 255)->nullable();
            $table->boolean('venduto')->default(false);
            $table->boolean('attivo')->default(true);
            $table->timestamps();
        });

    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('prodotti');
    }

}

我正试图从这个观点内部构建整体:

<!-- TEST -->
 <div class="well">
  @foreach($categorie as $categoria)
  <ul>
    <li>{{ $categoria->nome }}</li>
      <ul>
       @foreach($prodotti as $prodotto)
        <li>{{ $prodotto->codice }}</li>
       @endforeach
      </ul>
    </ul>
  @endforeach
 </div>
<!-- /TEST -->

它显然不起作用。

我以这种方式更改了视图,并且效果很好:

<div class="well">
  @foreach($categorie as $categoria)
    <ul>
      <li>{{ $categoria->nome }}</li>
      <ul>
      @foreach(Prodotto::where('categoria_id', '=', $categoria->id)->get() as $prodotto)
        <li><a href="#">{{ $prodotto->codice }}</a></li>
      @endforeach
      </ul>
    </ul>
  @endforeach
</div>

我怎样才能以优雅的“雄辩的方式”翻译它?

1 个答案:

答案 0 :(得分:0)

尝试替换:

@foreach($prodotti as $prodotto)

使用:

@foreach($categorie->prodotti as $prodotto)

让我知道它是否有效。

此外,由于您使用Eloquent关系,您只需要

return View::make('index')
    ->with('categorie',$categorie); 

未触及Prodotti模型:

 public function menuHome()
{
    $categorie = Categoria::where('attivo', '=', '1')->orderBy('nome','asc')->get();

    return View::make('index')
    ->with('categorie',$categorie);

}

编辑:也尝试更改为:

       public function prodotti()
{
    return $this->hasMany('Prodotto', 'categoria_id', 'id');
}

 public function categoria()
    {
        return $this->belongsTo('Categoria', 'categoria_id','id');
    }