欢迎各位兄弟 发布技术文章
这里的技术是共享的
// $users = DB::table('users')->join('userinfos','users.id','=','userinfos.user_id') // ->where('userinfo_end_day','>',Carbon::now()) // ->where('userinfo_end_day','<=',Carbon::now()->addMonth())->paginate(20WWW); $users = User::join('userinfos','users.id','=','userinfos.user_id') ->where('userinfo_end_day','>',Carbon::now()) ->where('userinfo_end_day','<=',Carbon::now()->addMonth())->paginate(20); // dd($users);exit;
1年前 由SEBASTIANSULINSKI发表
我想知道是否有一种从查询生成器返回特定模型集合的方法,以便我可以访问给定模型上的所有方法 - 像PDO:FETCH_CLASS:
$statement->fetchAll(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'App\User');
Laravel已经给你了类对象
$users = User::all(); // Get a collection of users
$user = $users->first(); // Get the first user from the collection
$user->someMethod(); // Call a function from the User model class
是的 - 我非常了解雄辩的ORM,但问题是查询生成器反对雄辩 - 无论是获取特定对象的集合而不是标准PHP类。
那么查询构建器就是这样做的,所以它可以在Laravel之外使用,所以不知道这是否可以。
如果您只获取正常的php对象,您可以将它们解析为一个模型
new Article($array)
我可以看到Illuminate\Database\Connection
有一个fetchMode
属性PDO::FETCH_OBJ
默认使用。还有一种公共方法setFetchMode
,但我不太清楚我是否可以在运行时为单个查询设置它?
另外 - 使它更混乱 - config/database.php
文件包含条目fetch
- 这是提取模式设置的地方,但我不知道那个是否对应于只有雄辩 - 我认为它是与它相关的默认值PDO::FETCH_CLASS
,这将是提取记录作为给定类名称的实例 - 但是 - 上面的评论说:
/*
|--------------------------------------------------------------------------
| PDO Fetch Style
|--------------------------------------------------------------------------
|
| By default, database results will be returned as instances of the PHP
| stdClass object; however, you may desire to retrieve records in an
| array format for simplicity. Here you can tweak the fetch style.
|
*/
'fetch' => PDO::FETCH_CLASS,
谢谢你们 - 我知道两者都使用PDO(如果没有,我会感到惊讶),而且我知道我可以将数组放在模型的构造函数中,但这并不是我以后的事情。我希望能够使用Query Builder返回类似于使用Eloquent的结果:
Post::all()
这将返回一组特定的模型 - 在这种情况下Post
。
查询生成器更容易使用更复杂的查询,并且执行得更好,然后口才,因此我有兴趣了解是否可以使用它与任何模型类。
实际上使用查询构建器或雄辩的性能非常小,如果有的话。您仍然调用php方法来构建查询。
就一个类上调用方法来说,只有有限的方法。为了方法返回查询构建器,该方法必须exacute查询构建器操作。默认情况下不是雄辩的,或任何东西。这真的只是简单的OOP。
使用Post :: all(),而类扩展eloquent(model)只是调用一个返回一个sql查询“select * from”sometable“的所有方法。所以类似于一个具有雄辩力的仓库只包含雄辩的调用,只是使包装查询构建器调用的方法。
金达php oop 101
感谢@jekinney - 我显然没有很好地解释自己 - 当我在给定的模型上说出方法时 - 我提到了一些自定义的方法,比如isActive()
我想要给定对象/模型的任何东西,而不是查询构建器的方法。关于性能 - 我相信这个区别是相当重要的 - 许多程序员选择了查询生成器的优秀原因(有关于这一点的评论),但是我个人没有做任何性能测试,所以在技术上可以不要评论
我需要它的原因是sql查询(查找表上的where语句)的复杂性,但是我已经设法用Eloquent来完成它。
关键是,它不仅仅是我以后的模型 - 让我重复一个问题:
有没有办法在查询生成器上更改提取模式PDO::FETCH_CLASS
并指定要用于集合中每个项目的确切类?
那么 - 如上所述 - fetchMode
每个扩展的类都有一个公共方法Connection
,这表明这可能是可能的 - 不知道是否有DB
立面。
从来没有 - 我已经解决了我使用雄辩的问题,但只是想知道是否有任何方法 - 这当然是一个有用的补充,因为我可以想到至少在几种情况下更改提取模式(不只是PDO::FETCH_CLASS
)会很方便 - 即使是StdClass
。
真的我认为你应该保持这些东西。我可以想象一个未来的开发人员试图重构你的应用程序消费两天了解你改变了查询构建器的提取模式:-)
它不是永久地更改它 - 只在每个查询的基础上。别担心 - 没有必要再发布。
@sebastiansulinski无法以连接方式更改提取模式。但是,这可能会对你有所帮助:
$arrayFromBuilder = DB::table('some_table')->get();
$collectionOfModels = SomeModel::hydrate($arrayFromBuilder);
它将返回SomeModel
包含实例的SomeModel
集合。从原来的帖子我猜这是你需要的?
感谢@JarekTkaczyk - 是的 - 当谈到这个模型可以工作。耻辱没有办法在运行时更改单个查询的提取模式,因为有一些非常有用的,我以前用过任何主流框架。
您可以随时编写自己的数据库驱动程序;)
这可能会在laravel中5.3