多个一对一的关系存在


multiple one to one relationships laravel

我正在Laravel中构建一个非常大的应用程序。用户管理他们自己的虚拟足球队。我有一个用户表,然后我有一个团队表,其中包含团队特定的内容,如名称,级别和竞技场等。对于竞技场,虽然我决定添加一个arena表,然后在teams表中添加arena_id列,而不仅仅是将竞技场名称添加到teams表中。

基本关系如下:

User hasOne Team

Team hasOne User

Team hasOne Arena

Arena hasOne Team

如果我想获取一个用户的竞技场我调用

方法
$user = User::with('team')->where('username', '=', $username)->first();
$user->team->arena->arena_name; 

,一切正常;然而,我觉得有一个更干净或更简单的方法来做到这一点。这个申请可以吗?

你做这件事的方式没有错。这是满足你需要的完美方法。然而,在User模型中创建getArenaFromUsername()方法可能会有所帮助。你的User模型看起来像这样:

<?php
class User extends 'Eloquent {
    protected $fillable = [];
    public function getArenaFromUsername($username)
    {
        $user = User::with('team')->where('username', '=', $username)->first();
        return $user->team->arena->arena_name;
    }
}

要从控制器中获取竞技场名称只需输入:

$user = new User;
$arena = $user->getArenaFromUsername($username);

----------------------------------------- 或 -----------------------------------------------

或者使用我们在模型中创建的相同方法在控制器中执行以下操作来使用依赖注入:

protected $user;
public function __construct(User $user)
{
    $this->user = $user;
}

那么要使用它,你可以在控制器的任何方法中使用一行,如下所示:

$this->user->getArenaFromUsername($username);

这些都是抽象查询的不同方式,使其在控制器中更易于重用和调用。不要害怕在你的模型中设置公共方法来调用。

几件事

你可以像这样加载子关系:

User::with('team', 'team.arena')...

您还可以在User模型上创建一个访问器函数(http://laravel.com/docs/eloquent#accessors-and-mutators),使其成为User对象的一等属性:

// accessed via $user->arena
public function getArenaAttribute {
  return $this->team->arena;
}
// accessed via $user->arenaName
public function getArenaNameAttribute {
  return $this->team->arena->arena_name;
}