Laravel,如何获得选择,数据库字段

Laravel, how to get selected, db fields

有一个模型,来自控制器,我需要访问这个模型数据库字段。

控制器中的代码:

$crud -> get() -> getAttributes();
//$crud->attributesToArray()
print_r($crud);

我能够获得整个 table 字段,但我只需要选中的字段。需要动态显示 table 仅包含选定的字段,可以在 运行 时间内更改。

我不确定 'selected' 数据库字段是什么意思。如果这是来自表单的列名列表,您可以简单地将其传递给 get() 方法:

$crud->get([
    'id',
    'name',
    'created_at',
]);

如果您想要可用列的列表,则无法从模型本身获取(它不知道存在哪些列)。相反,您可以使用:

$table = (new Crud)->getTable();
$columns = DB::getSchemaBuilder()->getColumnListing($table);

您可以使用两种方法,get() 或 all()

$crud -> get(['column1', 'column2']) 

$crud -> all(['column1', 'column2']) 

假设您有一个查询:

$query = Crud::select('id as Id', 'name as Name', 'something')
             ->selectRaw('CONCAT(id, "-", name) as Serial')
             ->get();

不知道什么查询,得到一个table看起来像这样

Id Name something Serial
1 A lorem 1-A
.. .... ......... ......

您需要使用 Builder 实例(在调用 ->get()

$query = Crud::select('id as Id', 'name as Name', 'something')
             ->selectRaw('CONCAT(id, "-", name) as Serial');

$results = $query->get();
dump($query->getQuery()->columns);
/*
[
    'id as Id',
    'name as Name',
    'something',
    Illuminate\Database\Query\Expression
]
*/
dump(array_map(function ($column) {
    return $column instanceof Illuminate\Database\Query\Expression
        ? Str::afterLast($column->getValue(), 'as ')
        : Str::afterLast($column, 'as ');
}, $query->getQuery()->columns));
/*
[
    'Id',
    'Name',
    'something',
    'Serial'
]
*/

这样你就可以看到了。

$query = Crud::select('id as Id', 'name as Name', 'something')
             ->selectRaw('CONCAT(id, "-", name) as Serial')
             ->get();

$columns = array_map(function ($column) {
    return $column instanceof Illuminate\Database\Query\Expression
        ? Str::afterLast($column->getValue(), 'as ')
        : Str::afterLast($column, 'as ');
}, $query->getQuery()->columns);

$results = $query->get();

return view('view', compact('columns', 'results'));

然后在你看来

<table>
  <thead>
    <tr>
      @foreach ($columns as $column)
        <th>{{ $column }}</th>
      @endforeach
    </tr>
  </thead>
  <tbody>
    @foreach ($results as $result)
      <tr>
        @foreach ($columns as $column)
          <td>{{ $result->{$column} }}</td>
        @endforeach
      </tr>
    @endforeach
  </tbody>
</table>