如何压缩此代码以便从Laravel Controller向视图发送信息?

时间:2015-07-07 03:27:27

标签: php laravel view controller eloquent

这是我在控制器中的编辑功能

public function edit($id)
{
    $game = Game::find($id);
    // build list of team names and ids
    $allTeams = Team::all();
    $team = [];
    foreach ($allTeams as $t)
        $team[$t->id] = $t->name();
    // build a list of competitions
    $allCompetitions = Competition::all();
    $competition = [];
    foreach ($allCompetitions as $c)
        $competition[$c->id] = $c->fullname();
    return View::make('games.edit', compact('game', 'team', 'competition'));
}

我发送数据以便在选择列表中显示。我知道Eloquent ORM方法列表,但问题是我知道它只能将属性名称作为参数,而不是方法(如name()fullname())。

如何优化此功能,我仍然可以使用Eloquent吗?

3 个答案:

答案 0 :(得分:3)

我会调查attributes and appends。您可以通过调整模型来完成您想要的任务。

<强>竞争

<?php namespace App;

use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;

class Competition extends Model
{

  protected $appends = ['fullname'];
  ...
  public function getFullnameAttribute()
  {
    return $this->name.' '.$this->venue;
  }
}

<强>团队

<?php namespace App;

use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;

class Team extends Model
{

  protected $appends = ['name'];
  ...
  public function getNameAttribute()
  {
    return $this->city.' '.$this->teamName;
  }
}

<强>控制器

public function edit($id)
{
    $game = Game::find($id);
    $team = Team::get()->lists('id','name');
    $competition = Competition::get()->lists('id','fullname');
    return View::make('games.edit', compact('game', 'team', 'competition'));
}

答案 1 :(得分:0)

我唯一能想到的(除了使用Eloquent集合的地图功能)是覆盖模型中的toArray方法以添加一些自定义属性。

例如

public function toArray()
{
    return array_merge(parent::toArray(), [
        'fullname' => $this->fullname(),
    ]);
}

这将允许您使用类似:

$competition = $allCompetitions->fetch('fullname');

<强>虽然

在说这一切时,我认为更优雅的解决方案是将整个竞争对象提供给视图,并让你渲染它们的循环(或其他)调用方法本身。

答案 2 :(得分:0)

如果视图文件与其他模型无关,则可以在视图文件中调用模型方法。所以如果name()&amp; fullname()返回与此模型相关的结果,然后您可以在视图中使用此模型方法

@foreach (($allTeams as $t)
    {{ $t->name() }}
@endforeach

当然,您必须将$ allteams集合从控制器传递到视图