【问题标题】:How to join tables in Laravel?如何在 Laravel 中加入表格?
【发布时间】:2020-05-24 11:20:03
【问题描述】:

我是 Laravel 的新手,我有一个关于 Eloquent 的问题:

这是我的数据库表结构:

users
- id
- user_id
- username
- name
- email
- password
- email_verified_at
- remember_tok
- created_at
- updated_at

challenges
- id
- challenge_id
- category_id
- hashtag
- title
- description
- duration
- link
- created_at
- updated_at
- user_id

user_challenges
- user_id
- challenge_id
- duration
- created_at
- updated_at

我想要实现的是显示用户的挑战,例如,如果用户在用户仪表板中加入挑战,我想显示他加入的挑战,以及用户创建的挑战(如果他创造了任何);

Models\User.php

class User extends Authenticatable
{
    use Notifiable;

    public function challenges() {
        return $this->hasMany(Challenge::class, 'user_id');
    }

    public function userChallenges() {
        return $this->hasMany(UserChallenge::class, 'user_id');
    }
}

模型\Challenge.php

class Challenge extends Model
{
    public function user () {
        return $this->belongsTo(User::class, 'user_id');
    }
}

模型\UserChallenge.php

class UserChallenge extends Model
{
    public function user () {
        return $this->belongsTo(User::class, 'user_id');
    }
}

这是我的家庭控制器中的内容: App\Http\Controllers\HomeController.php

class HomeController extends Controller
{
    public function index()
    {
        $user_id = auth()->id();
        $user = User::find($user_id);

        return view('home')
            ->with('challenges', $user->challenges)
            ->with('userChallenges', $user->userChallenges);
    }
}

这是我目前在“我的仪表板”中为“已加入挑战”获得的信息 - 但是如何在返回视图时加入表格,以便还可以获得挑战主题标签标题?就像我在“我的挑战”部分下得到的一样? Dashboard

更新: 我应该在我的数据库中添加什么,以便统计参加挑战的用户数量?

【问题讨论】:

  • 我认为Many to Many relationship 是您正在寻找的,用于链接用户和他们加入的挑战。这将帮助您解决当前面临的两个问题
  • 为 $user->challenges 和 $user->userChallenges 选择 id,创建一个包含所有 id 的数组,去除重复项,重新查询 DB whereIn(unique ids)。
  • @nikistag 你能给我一个代码吗?
  • @ArunAS 是的,我知道这是多对多关系,我只是不知道如何实现它

标签: php mysql laravel eloquent


【解决方案1】:

为了获得用户创造的挑战,我相信你已经做对了。

并让用户加入挑战。你几乎可以用你的数据透视表做对了。你可以在 laravel 文档中查看 many-to-many relationship

这些是检索用户创建的挑战和用户加入的挑战的示例代码。这些代码应该驻留在您的用户模型中,您应该保留该模型。

public function created_challenges()
{
    return $this->hasMany(Challenge::class,'user_id','id');
}

public function joined_challenges()
{
     return $this->belongsToMany(Challenges::class, 'user_challenges', 'user_id', 'challenges_id');
}

一旦关系正常工作,您就可以简单地使用从关系返回的集合。将$user->joined_challenges 传递给视图后,您可以执行以下操作

@foreach ($joined_challenges as $challenge)
    <p>{{$challenge->hashtag}}</p>   
    <p>{{$challenge->title}}</p>   
@endforeach

让我知道这行得通,干杯! ;)

【讨论】:

  • 我添加了这行代码,但它不起作用 - 我收到此错误:“找不到类 'App\Challenges'” - 我在用户模型中添加了 'App\Challenges' 但它没有工作然后我得到最大执行超时错误..
  • 我需要同时收到用户创建的挑战,我目前正在收到它们,如您在帖子上方的屏幕截图中所见,以及用户当前加入的挑战,我我也得到了它们,但我只得到了用户的 ID 和挑战,我还想从挑战表中获取其他信息
  • 好的抱歉有一个错误(它是挑战而不是挑战),现在它工作正常,但我仍然不确定如何获得加入挑战的标题、主题标签?
  • 还有这个,因为我得到了我需要的一切——我不需要用户模型,对吧?
  • 您可以简单地添加withPivot('columnName'),然后使用$model-&gt;pivot-&gt;columnName获取列
猜你喜欢
  • 2021-06-14
  • 2013-10-12
  • 2019-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
  • 2019-04-26
相关资源
最近更新 更多