使用 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 子句一起使用