【问题标题】:Use a column value in an other table with laravel query builder使用 laravel 查询生成器在另一个表中使用列值
【发布时间】:2017-06-16 16:47:34
【问题描述】:

我有两个名为 users 和 Inbox 的表女巫

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

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

【问题讨论】:

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


    【解决方案1】:

    我认为你应该像这样更新你的代码:

    $user_messages = DB::table('messages')
                       ->select('messages.id as msgId','messages.message as message','users.id as userId','users.user_name as user_name')
                       ->join('messages','messages.user_id','=','users.id')
                       ->where('messages.user_id',$user_id)
                       ->get();
    
    return view("view.path")
               ->with('messages',$user_messages);
    

    希望这对你有用!

    【讨论】:

      【解决方案2】:

      在模型中:

      命名空间应用程序;

      使用 Illuminate\Database\Eloquent\Model;

      类消息扩展模型 { 受保护的 $table = 'table_name';

      public function sender()
      {
          return $this->belongsTo('App\User', 'sender_id', 'id');
      }
      

      }

      在控制器中:

      公共函数functionName($user_id){

      $messages = Messages::where('sender_id', $user_id)->get();
      
      return view("view.path")
              ->with('messages',$messages);
      

      }

      在视图中,您可以访问像这样的家宴详细信息 $message->sender->name for name for id $message->sender->id

      【讨论】:

        【解决方案3】:

        当你使用 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 将如何命名 Inbox 模型迁移...因为,我认为,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 将用来构建查询的外键。在有趣的部分之前还有最后一部分。我们需要在模型中创建关系。从用户一开始:

        应用程序/用户.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();
        

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

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

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

        //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

        【讨论】:

          猜你喜欢
          • 2017-03-29
          • 2016-10-28
          • 1970-01-01
          • 2017-12-28
          • 2019-05-06
          • 1970-01-01
          • 2019-08-26
          • 2014-02-21
          相关资源
          最近更新 更多