【问题标题】:How to select specific columns in laravel eloquent如何在 laravel eloquent 中选择特定的列
【发布时间】:2016-11-05 11:39:39
【问题描述】:

假设我在表格中有 7 列,我只想选择其中的两列,就像这样

SELECT `name`,`surname` FROM `table` WHERE `id` = '1';

在 laravel eloquent 模型中它可能看起来像这样

Table::where('id', 1)->get();

但我猜这个表达式将选择 id 等于 1 的所有列,并且我只想要两列(姓名、姓氏)。如何只选择两列?

【问题讨论】:

  • 感谢您提出问题。这太疯狂了,因为我总是在“经典”SQL 查询中正确地做到这一点,但是不得不使用 Eloquent,我发现它太令人困惑了,我很高兴能够让它工作,并且忘记了我的查询使用了多少内存,因为我正在选择所有内容。
  • ModelName::findOrFail(1, ['name', 'surname']);

标签: laravel laravel-5 orm eloquent


【解决方案1】:

你可以这样做:

Table::select('name','surname')->where('id', 1)->get();

【讨论】:

  • 假设我想选择每个字段,除了一个字段,我该怎么做
  • 首先,当你有问题时,问一个。对于您的情况 - 只需提及所有列而不是您不想包含的列。就这么简单。
  • 如果不提及所有列,就没有其他方法可以做到这一点
  • 这适用于具有单个表的基本情况。但是,如果您在数据透视表上使用关系,那么这也会自动选择数据透视列。
  • @OPV 它只是运行SELECT name, surname FROM Table where id = 1 SQL 查询
【解决方案2】:

您可以使用Table::select ('name', 'surname')->where ('id', 1)->get ()

请记住,当仅选择某些字段时,如果您最终在请求中访问这些其他字段,则必须进行另一个查询(这可能很明显,只是想包含该警告)。包含 id 字段通常是一个好主意,因此 laravel 知道如何将您对模型实例所做的任何更新写回。

【讨论】:

    【解决方案3】:
    Table::where('id', 1)->get(['name','surname']);
    

    【讨论】:

    • 我想要同样的东西,但使用不同的方法。我想通过创建模型实例来选择方法,然后选择列。即 $model = new MyModel(); $model->select(['col1', 'col2']);但这件事不起作用
    • 我相信这是它应该使用的方式。我不知道 select() 是否比 get() 快。
    • 也可以是model::where('col', val)->get(['col1', 'col2']);
    【解决方案4】:

    另外Model::all(['id'])->toArray() 它只会获取 id 作为数组。

    【讨论】:

      【解决方案5】:

      您首先需要创建一个模型,代表该表,然后使用以下 Eloquent 方式仅获取 2 个字段的数据。

      Model::where('id', 1)
               ->pluck('name', 'surname')
               ->all();
      

      【讨论】:

      • 这是最好的答案,因为它也适用于多对多关系中的数据透视表。
      • 这应该是答案
      【解决方案6】:

      通过使用 all() 方法,我们可以从表中选择特定的列,如下所示。

      ModelName::all('column1', 'column2', 'column3');
      

      注意:Laravel 5.4

      【讨论】:

      • 我想要同样的东西,但使用不同的方法。我想通过创建模型实例来选择方法,然后选择列。即 $model = new MyModel(); $model->select(['col1', 'col2']);但这东西行不通。
      【解决方案7】:

      您可以使用以下查询:

      Table('table')->select('name','surname')->where('id',1)->get();
      

      【讨论】:

      • 请在您的答案中添加一些解释,以便其他人可以从中学习
      【解决方案8】:

      你也可以使用 pluck。

      Model::where('id',1)->pluck('column1', 'column2');
      

      【讨论】:

      • 请注意,pluck() 的效率低于所讨论的其他方法,因为它不会修改 SELECT ... 查询,而是对已返回的结果集进行操作。
      【解决方案9】:

      你可以使用 get() 和 all()

      ModelName::where('a', 1)->get(['column1','column2']);
      

      【讨论】:

      • 这个答案应该有更多的选票。
      【解决方案10】:

      要从表中获取特定列的结果,我们必须指定列名。

      使用以下代码:-

         $result = DB::Table('table_name')->select('column1','column2')->where('id',1)->get();  
      

      例如-

      $result = DB::Table('Student')->select('subject','class')->where('id',1)->get();  
      

      【讨论】:

      • 请在您的答案中添加一些解释,以便其他人可以从中学习
      【解决方案11】:

      ->get() 很像->all()(和->first() 等)可以将您想要带回的字段作为参数;

      ->get/all(['column1','column2'])

      会带回收藏,但仅限 column1column2

      【讨论】:

        【解决方案12】:

        你也可以像这样使用find()

        ModelName::find($id, ['name', 'surname']);
        

        $id 变量可以是一个数组,以防您需要检索模型的多个实例。

        【讨论】:

        • 这应该是选择的答案。
        【解决方案13】:

        这里也可以使用findOrFail()方法很好用

        如果未捕获到异常,则会自动将 404 HTTP 响应发送回用户。使用这些方法时,不需要编写显式检查来返回 404 响应,不会给出 500 错误..

        ModelName::findOrFail($id, ['firstName', 'lastName']);
        

        【讨论】:

          【解决方案14】:

          虽然最常见的方法是使用Model::select,但 它可能导致渲染出模型类中使用访问器方法定义的所有属性。因此,如果您在模型中定义属性:

          <?php
          
          namespace App;
          
          use Illuminate\Database\Eloquent\Model;
          
          class User extends Model
          {
              /**
               * Get the user's first name.
               *
               * @param  string  $value
               * @return string
               */
              public function getFirstNameAttribute($value)
              {
                  return ucfirst($value);
              }
          }
          

          然后使用: TableName::select('username')-&gt;where('id', 1)-&gt;get();

          它将输出带有first_nameusername 的集合,而不仅仅是用户名。

          最好使用pluck(),单独使用或可选地与select 结合使用 - 如果您需要特定的列。

          TableName::select('username')-&gt;where('id', 1)-&gt;pluck('username');

          TableName::where('id', 1)-&gt;pluck('username'); //这将返回仅包含 username 值的集合

          另外,可选地,使用-&gt;toArray() 将集合对象转换为数组。

          【讨论】:

            【解决方案15】:

            如果您想获取单行并从该行单列,获取特定列的值的一行代码是使用find() 方法以及指定要检索它的列。

            这里是示例代码:

            ModelName::find($id_of_the_record, ['column_name'])->toArray()['column_name'];
            

            【讨论】:

              【解决方案16】:

              从 laravel 5.3 开始,仅使用 get() 方法您可以获得表格的特定列:

              YouModelName::get(['id', 'name']);
              

              或者从 laravel 5.4 你也可以使用all() 方法来获取你选择的字段:

              YourModelName::all('id', 'name');
              

              上述两种方法get()all() 也可以使用where(),但两者的语法不同:

              模型::all()

              YourModelName::all('id', 'name')->where('id',1);
              

              模型::get()

              YourModelName::where('id',1)->get(['id', 'name']);
              

              【讨论】:

                【解决方案17】:

                获取一列的值:

                Table_Name::find($id)->column_name;
                

                您可以将此方法与 where 子句一起使用:

                Table_Name::where('id',$id)->first()->column_name;
                

                或使用此方法绕过 PhpStorm “App\Models 中未找到的方法”:

                Table_Name::query()->where('id','=',$id)->first()->column_name;
                

                在查询生成器中:

                DB::table('table_names')->find($id)->column_name;
                

                与 where 条款:

                DB::table('table_names')->where('id',$id)->first()->column_name;
                

                DB::table('table_names')->where('id',$id)->first('column_name');
                

                最后一个方法的结果是数组

                【讨论】:

                  【解决方案18】:
                  use App\Table;
                  // ...
                  Table::where('id',1)->get('name','surname');
                  

                  如果没有在哪里

                  Table::all('name','surname');
                  

                  【讨论】:

                  • 很好的答案,但缺少方括号。应该像:->get(['name','surname']);
                  【解决方案19】:
                  ModelName::find($id, ['name', 'surname']);
                  

                  【讨论】:

                    【解决方案20】:

                    如果你想从数据库中获取单个值

                        Model::where('id', 1)->value('name');
                    

                    【讨论】:

                    • @NachoMezzadra 其实我做到了:):)
                    【解决方案21】:

                    您可以通过多种方式获得它。其中一些如下所示-

                    //Eloquent: Get specific columns (not all the row). Pluck returns an array.
                    Model::where('id', 1)->pluck('name', 'surname');
                    // If you only want to get the result value:
                    Model::where('id', 1)->value('name');
                    

                    或者,

                    Model::where('id', 1)
                         ->pluck('name', 'surname')
                         ->all();
                    

                    或者,

                    ModelName::all('column1', 'column2', 'column3');
                    

                    或者,

                    ModelName::find($id, ['name', 'surname']);
                    

                    【讨论】:

                      【解决方案22】:

                      你可以得到它像

                      `PostModel::where('post_status', 'publish')->get(['title', 'content', 'slug', 'image_url']`)
                      

                      link

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2017-02-22
                        • 1970-01-01
                        • 2018-01-28
                        • 1970-01-01
                        • 2015-05-08
                        • 2021-01-21
                        • 1970-01-01
                        • 2013-09-08
                        相关资源
                        最近更新 更多