使用 Laravel 和 Eloquent 从表中全选

Posted

技术标签:

【中文标题】使用 Laravel 和 Eloquent 从表中全选【英文标题】:Select all from table with Laravel and Eloquent 【发布时间】:2014-03-20 10:51:04 【问题描述】:

我正在使用 Laravel 4 设置我的第一个模型以从名为 posts 的表中提取所有行。

在标准 mysql 中我会使用:

SELECT * FROM posts;

如何在我的 Laravel 4 模型中实现这一点?

下面是我的完整模型源代码:

<?php

class Blog extends Eloquent 


    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'posts';

    public function getAllPosts()
    

    


【问题讨论】:

【参考方案1】:

你只需调用

Blog::all();

//example usage.
$posts = Blog::all();

$posts->each(function($post) // foreach($posts as $post)  

    //do something

从应用程序的任何位置。

阅读documentation 会有很大帮助。

【讨论】:

小心使用::all(),因为它会将everything从表中读入内存。如果您的表有很多记录,那么您可以快速超过 PHP 的内存限制。解决方案显然是使用Builder::cursor()Builder::chunk() 如果您使用 apache 达到最大内存限制,您将收到 500 错误消息 Blog::all(); 对那里的代码稍作更新:你需要右括号和分号:$posts->each(function($post) //do something ); 关于如何检查 $posts 是否为空的任何 cmets。【参考方案2】:
 public function getAllPosts()
 
   return  Blog::all();        
 

看看docs这可能是他们解释的第一件事..

【讨论】:

【参考方案3】:

好吧,用雄辩的方式来做:

Blog:all();

在您的模型中,您可以:

return DB::table('posts')->get();

http://laravel.com/docs/queries

【讨论】:

为什么不只是 $this->all()?这看起来真的很迂回。【参考方案4】:

有 3 种方法可以做到这一点。

1 - 使用 all() 或 get();

$entireTable = TableModelName::all();

例如,

$posts = Post::get(); // both get and all  will work here

$posts = Post::all();

2 - 使用 DB 外观

将此行放在控制器中的类之前

use Illuminate\Support\Facades\DB; // this will import the DB facade into your controller class

现在上课了

$posts = DB::table('posts')->get(); // it will get the entire table

或者更动态的方式是 -

$postTable = (new Post())->getTable(); // This will get the table name
$posts = DB::table($postTable)->get();

这种方式的优点是,如果您更改表名,它不会返回任何错误,因为它会从Post 模型中动态获取表名。确保在顶部导入Post 模型,如DB fadade。

3 - 使用带有 select 的 DB 外观

将此行放在控制器中的类之前

*Same import the DB facade like method 2*

现在在控制器中

$posts = DB::select('SELECT * FROM posts');

【讨论】:

【参考方案5】:

去你的控制器写这个函数

public function index()

  $posts = \App\Post::all();

  return view('yourview', ['posts' => $posts]);

为了展示它

@foreach($posts as $post)
   $post->yourColumnName 
@endforeach

【讨论】:

【参考方案6】:

如何使用 laravel 从数据库中获取所有数据以查看,希望这个解决方案对初学者有所帮助。

在你的控制器内部

public function get()
        $types = select::all();
        return view('selectview')->with('types', $types);

在控制器中导入数据模型,在我的应用程序中,数据模型命名为 select。

use App\Select;

包括我的两个控制器看起来像这样

use App\Select;
class SelectController extends Controller                             
    public function get()
    $types = select::all();
    return view('selectview')->with('types', $types);

选择型号

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Select extends Model

    protected $fillable = [
        'name', 'email','phone','radio1','service',
    ];


    protected $table = 'selectdata';
    public $timestamps = false;

路由器内部

Route::get('/selectview', 'SelectController@get');

selectview.blade.php

@foreach($types as $type)
    <ul>
    <li> $type->name </li>
    </ul>

    @endforeach

【讨论】:

【参考方案7】:

这对我有用。

$posts = Blog::get()->all();

【讨论】:

【参考方案8】:

使用DB facade可以执行SQL查询

 public function index()

    return DB::table('table_name')->get();

【讨论】:

【参考方案9】:

如果你的表很大,你也可以通过“小包”处理行(不是全部在 oce)(laravel doc:Eloquent> Chunking Results)

Post::chunk(200, function($posts)

    foreach ($posts as $post)
    
        // process post here.
    
);

【讨论】:

@Kamlesh 将您的评论写为关于堆栈溢出的单独问题 - 提供更多详细信息【参考方案10】:
Query
// Select all data of model table
Model::all();
// Select all data of model table
Model::get();

Model::where('foo', '=', 'bar')->get();

Model::find(1);
Model::find([1, 2, 3]);
Model::findOrFail(1);

【讨论】:

欢迎来到 SO。通过包含对您如何回答问题的解释来改进纯代码答案。【参考方案11】:

在 Laravel Eloquent 中,您可以在控制器中进行以下查询,以获取所需表中的所有数据:

$posts = Post::all();
return view('post', compact('posts'));

或者

$posts = Post::orderBy('id')->get();
return view('post', compact('posts'));

【讨论】:

【参考方案12】:
$posts = DB::select('SELECT * FROM table_x');

或获取特定列:

$posts = DB::select('SELECT col_a, col_b, col_c FROM table_x');

【讨论】:

这与 Laravel 采用的 MVC 方法背道而驰。它会起作用,但我认为这是不好的做法 感谢莫里斯,请随时改进方法 这很简单。无需在控制器内部进行查询,只需调用您的模型并让它为您执行数据库命令。

以上是关于使用 Laravel 和 Eloquent 从表中全选的主要内容,如果未能解决你的问题,请参考以下文章

将 Haversine 公式与 Laravel eloquent 和多个 where 子句一起使用

Laravel Eloquent,仅选择存在关系的行

Laravel Eloquent/DB 选择每组前 1 行

Laravel Eloquent:all() 的排序结果

使用 laravel eloquent 从两个连接表中获取数据

在 Laravel Eloquent 中使用关系表中的特定列获取表中的特定列