Laravel - 定义正确的关系

时间:2016-05-11 14:51:36

标签: laravel

用户表中包含$("#username").keyup(function (e){ clearTimeout(x_timer); var user_name = $(this).val(); if(user_name.length >= 6){ //Validate number of characters here x_timer = setTimeout(function(){ check_username_ajax(user_name); }, 1000); } }); 字段。

区域表中包含zone_id字段。

  • 每个用户都可以在一个区域中,例如 zone_id = 1

  • 每个区域属于一个世界,例如 - world_id = 5

我想要的输出是返回用户区和世界信息。

这就是我没有任何关系设置的原因:

world_id

我的问题是..我确信关系可以用于更清晰的代码,但我不确定如何设置它。

  1. 我应该坚持使用当前代码还是定义关系?
  2. 如果1的答案是定义关系,那么这3个模型之间的正确关系有何帮助?
  3. 解决方案1:

    $zone = Zone::find($user->zone_Id);
    $world = World::find($zone->world_id);
    $data = $user;
    $data['zone'] = $zone;
    $data['zone']['world'] = $world;
    

    错误:`public function getZone(Request $request) { $token = $request->input('token'); $user = JWTAuth::toUser($token); // Simplest example using relationships $userWithZone = User::with('zone.world')->find($user->id); // You'll get the `zone` relationship info here, too return $userWithZone; }`

1 个答案:

答案 0 :(得分:1)

以下是一个如何通过Eloquent Relationships实现这一目标的例子。

// User.php
class User
{
    public function zone()
    {
        return $this->belongsTo(Zone::class);
    }
}

// Zone.php
class Zone
{
    public function world()
    {
        return $this->belongsTo(World::class);
    }
}

使用关系的最简单示例

$user = User::with('zone.world')->find($id); // You'll get the `zone` relationship info here, too

如果你想要

,你的关系会更复杂
$user = User::with(['zone' => function($query) {
    $query->with('world')
          ->select('id', 'zone_name', 'world_id');
})->select('username', 'zone_id')->find($id);

甚至......

$user = User::with(['zone' => function($query) {
    $query->with(['world' => function($query2) {
        $query2->select('id', 'world_name');
    }])->select('id', 'zone_name', 'world_id');
})->select('username', 'zone_id')->find($id);

您生成的$user将如下所示:

'user' => [ // This is a Collection
    'username',
    'email',
    'zone_id',
    'zone' => [ // This is a Collection
        'id',
        'zone_name',
        'world_id',
        'world' => [ // This is a Collection
            'id',
            'world_name'
        ]
    ]
];