mysql - 使用 laravel 查询生成器在另一个表中使用列值

标签 mysql laravel laravel-5.3 query-builder laravel-query-builder

我有两个名为用户和收件箱的表女巫

在收件箱表中,我有一个名为 sender_id 的列,其中包含发件人的 user_id

我想在 View 中显示此消息。我需要一个查询来从收件箱表中获取 sender_id 并使用它从用户表中选择某个用户 我需要对所有消息和所有用户执行此操作。

最佳答案

当你使用 eloquent 时,Laravel 基本上是直截了当的。您可以随时对其进行自定义。

首先,几乎所有时间,我都使用以下方法同时创建模型和迁移:php artisan make:model Something --migration

我知道您已经制作了一些模型和/或迁移,但我会逐步帮助您理解它。

因此,在您的情况下,它将是 php artisan make:model User --migrationphp artisan make:model Inbox --migration。这样做,您将获得两个名为 UserInbox 的模型以及两个名为 date_create_users_table.phpdate_create_inboxs_table.php 的迁移.也许您已经使用 php artisan make:auth 创建了默认用户表。如果是这样,请不要重新制作。

我不确定 Laravel 将如何命名收件箱模型迁移......我认为,从 Laravel 5.3 开始,多元化发生了变化,并不总是在末尾添加“S”。

然后,现在您已经有了模型和迁移,让我们在迁移文件中添加一些行。因为你想建立一对多的关系。您无需触摸用户。仅收件箱迁移。每个收件箱都与一个用户相关,用户可以有多个收件箱。在您的迁移中添加类似这样的内容:

public function up()
{
    Schema::create('inboxs', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('user_id');
        $table->foreign('user_id')->references('id')->on('users');
        all other columns...
    });
}

在那里,如果您需要发件人、收件人等,您可以更改列的名称...改为这样做:

public function up()
{
    Schema::create('inboxs', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('sender_id');
        $table->foreign('sender_id')->references('id')->on('users');
        $table->integer('recipient_id');
        $table->foreign('recipient_id')->references('id')->on('users');
        all other columns...
    });
}

我们刚才所做的是创建 Laravel 将用来构建查询的外键。在有趣的部分之前还有最后一部分。我们需要在我们的模型中创建关系。从用户一开始:

应用程序/User.php

public function inboxs() {
    return $this->hasMany(Inbox::class);
}

现在进入 App/Inbox.php 模型:

public function user() {
    return $this->belongsTo(User::class);
}

如果您需要发件人/收件人等...请改用这种方式:

public function sender() {
    return $this->belongsTo(User::class);
}

public function recipient() {
    return $this->belongsTo(User::class);
}

请注意,您的每个函数都需要以与迁移相同的方式编写。 sender_id 需要一个名为 sender() 的关系。

现在,我们的关系已经完成,我们可以简单地使用 eloquent 调用所有内容。

$inboxs = Inbox::with('sender')->get();

这会将所有收件箱的数组返回到收件箱表中。您可以通过这种方式访问​​发件人:$inboxs[0]->sender();

您需要 id,执行此操作:$sender_id = $inboxs[0]->sender_id;
发件人姓名:$sender_name = $inboxs[0]->sender->name;

如果你想获得一个收件箱并且你有 id,只需执行此操作 $inbox = Inbox::with('sender')->find($id);
这样你就不会得到一个数组,只有一个结果,并且可以使用 $sender_name = $inbox->sender->name; 直接访问发件人,而不必添加 [0] 或使用foreach 循环。

您可以使用如下方式获取用户发送的所有消息:

$inboxs = Inbox::where('sender_id', $sender_id)->get();

最后,您可以使用以下方式将数据传递给 View :

return view('path.to.view')->with('inbox',$inbox);

在 View 中,您这样做是为了显示发件人的姓名:

//If view.blade.php
{{$inbox['sender']['name']}} //work a 100%
{{$inbox->sender->name}} //I'm not sure about this one

//If not using blade
<?php echo $inbox['sender']['name']; ?>

您可以使用 Eloquent 做很多事情,您可以添加任意多的条件。如果你想使用 Eloquent,我建议你真正做的唯一一件事是注意 n+1 问题。 There is a link where I explain it .查找我的答案的编辑部分。

如果您需要一些文档:
Laravel 5.3 Relationships
Laravel 5.3 Migrations
Laravel 5.3 Eloquent

关于mysql - 使用 laravel 查询生成器在另一个表中使用列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41954362/

相关文章:

python - 使用Python将LOG文件信息输入MySQL

mysql - "Subquery returns more than 1 row"错误

php - Laravel 有很多通过 2 个表

php - 从 View 中的公用文件夹调用 CSS。拉维尔 5.3

php - 从 Laravel 查询构建器中获取具有 elquent 关系的数据

mysql - 如何找到超过 2 个用户的匹配时间间隔

mysql - 删除mysql上的重复记录?

php - Laravel 路线看不到 Controller 操作

php - Laravel 产品,CORS 编号 'Access-Control-Allow-Origin' header

php - Laravel 任务调度程序不起作用