【问题标题】:multiple one to one relationships laravel多个一对一关系 laravel
【发布时间】:2014-06-12 14:40:54
【问题描述】:

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

所以这是基本的关系:

用户拥有一个团队

团队有一个用户

团队拥有一个竞技场

竞技场有一个团队

所以如果我想为用户获取竞技场,我调用该方法

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

$user->team->arena->arena_name; 

一切正常;但是我觉得有一种更清洁或更简单的方法可以做到这一点。该应用程序是否存在或是否可以?

【问题讨论】:

  • 仅供参考:您也可以使用 User::with('team', 'team.arena') 来急切加载子关系。

标签: php mysql laravel eloquent


【解决方案1】:

你的做法没有错。这是满足您需求的一种非常好的方法。然而,可能有帮助的是在 User 模型中创建一个 getArenaFromUsername() 方法。您的用户模型看起来像这样:

<?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);

这些都是抽象查询的不同方法,以使其更可重用和更清晰地调用控制器。不要害怕在你的模型中创建公共方法来调用。

【讨论】:

    【解决方案2】:

    几件事。

    您可以像这样急切加载子关系:

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-09-27
      • 2018-10-03
      • 2018-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多