如何压缩此代码以从 Laravel 控制器向视图发送信息?
How can I compact this code for sending info to the view from the Laravel Controller?
这是我在控制器中的编辑功能
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'));
}
我发送数据是为了显示在 select 列表中。我知道 Eloquent ORM 方法列表,但据我所知,问题是它只能将 属性 名称作为参数,而不是方法(如 name()
和 fullname()
).
如何优化这个,我还能用Eloquent吗?
我唯一能想到的(除了使用 Eloquent 集合的地图功能)是覆盖模型中的 toArray
方法以添加一些自定义属性。
例如
public function toArray()
{
return array_merge(parent::toArray(), [
'fullname' => $this->fullname(),
]);
}
这将允许您使用类似的东西:
$competition = $allCompetitions->fetch('fullname');
虽然:
综上所述,我认为更优雅的解决方案是将整个竞争对象提供给视图,并让渲染它们(或其他)的循环调用方法本身。
我会调查 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'));
}
如果与其他模型无关,可以调用视图文件中的模型方法。因此,如果 name() & fullname() returns 结果与此模型相关,那么您可以在 view
中使用此模型方法
@foreach (($allTeams as $t)
{{ $t->name() }}
@endforeach
当然你必须将 $allteams 集合从控制器传递给视图
这是我在控制器中的编辑功能
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'));
}
我发送数据是为了显示在 select 列表中。我知道 Eloquent ORM 方法列表,但据我所知,问题是它只能将 属性 名称作为参数,而不是方法(如 name()
和 fullname()
).
如何优化这个,我还能用Eloquent吗?
我唯一能想到的(除了使用 Eloquent 集合的地图功能)是覆盖模型中的 toArray
方法以添加一些自定义属性。
例如
public function toArray()
{
return array_merge(parent::toArray(), [
'fullname' => $this->fullname(),
]);
}
这将允许您使用类似的东西:
$competition = $allCompetitions->fetch('fullname');
虽然:
综上所述,我认为更优雅的解决方案是将整个竞争对象提供给视图,并让渲染它们(或其他)的循环调用方法本身。
我会调查 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'));
}
如果与其他模型无关,可以调用视图文件中的模型方法。因此,如果 name() & fullname() returns 结果与此模型相关,那么您可以在 view
中使用此模型方法@foreach (($allTeams as $t)
{{ $t->name() }}
@endforeach
当然你必须将 $allteams 集合从控制器传递给视图