欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

laravel query builder get array to model object 有大用

1) 我使用 数据库操作之 - Eloquent ORM来代替查询构造器
//            $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;



2) (没有试过)
 [5.2]将集合从查询构建器更改为[5.3],从查询构建器返回集合




Query Builder将特定模型的集合返回给StdClass

1年前 由SEBASTIANSULINSKI发表

我想知道是否有一种从查询生成器返回特定模型集合的方法,以便我可以访问给定模型上的所有方法 - 像PDO:FETCH_CLASS:

$statement->fetchAll(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'App\User');
阿纳布拉曼
 阿纳布拉曼
1年前(1,345 XP)

我面临着类似的问题。我也需要这个解决方案。

 
bobbybouwmann
 bobbybouwmann
1年前(855,025 XP)

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 
 
sebastiansulinski

是的 - 我非常了解雄辩的ORM,但问题是查询生成器反对雄辩 - 无论是获取特定对象的集合而不是标准PHP类。

 
bobbybouwmann
 bobbybouwmann
1年前(855,025 XP)

那么查询构建器就是这样做的,所以它可以在Laravel之外使用,所以不知道这是否可以。

 
jlrdw
jlrdw
1年前(138,630 XP)

查询构建器的工作方式相同。都是基于pdo。

 
bobbybouwmann
 bobbybouwmann
1年前(855,025 XP)

如果您只获取正常的php对象,您可以将它们解析为一个模型

new Article($array)
 
sebastiansulinski

我可以看到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,
 
sebastiansulinski

谢谢你们 - 我知道两者都使用PDO(如果没有,我会感到惊讶),而且我知道我可以将数组放在模型的构造函数中,但这并不是我以后的事情。我希望能够使用Query Builder返回类似于使用Eloquent的结果:

Post::all()

这将返回一组特定的模型 - 在这种情况下Post

查询生成器更容易使用更复杂的查询,并且执行得更好,然后口才,因此我有兴趣了解是否可以使用它与任何模型类。

 
杰基尼
杰基尼
1年前(216,825 XP)

实际上使用查询构建器或雄辩的性能非常小,如果有的话。您仍然调用php方法来构建查询。

就一个类上调用方法来说,只有有限的方法。为了方法返回查询构建器,该方法必须exacute查询构建器操作。默认情况下不是雄辩的,或任何东西。这真的只是简单的OOP。

使用Post :: all(),而类扩展eloquent(model)只是调用一个返回一个sql查询“select * from”sometable“的所有方法。所以类似于一个具有雄辩力的仓库只包含雄辩的调用,只是使包装查询构建器调用的方法。

金达php oop 101

感谢@jekinney - 我显然没有很好地解释自己 - 当我在给定的模型上说出方法时 - 我提到了一些自定义的方法,比如isActive()我想要给定对象/模型的任何东西,而不是查询构建器的方法。关于性能 - 我相信这个区别是相当重要的 - 许多程序员选择了查询生成器的优秀原因(有关于这一点的评论),但是我个人没有做任何性能测试,所以在技术上可以不要评论

我需要它的原因是sql查询(查找表上的where语句)的复杂性,但是我已经设法用Eloquent来完成它。

 
pmall
 pmall
1年前(574,845 XP)

使用查询构建器检索有说服力的对象有何意义?只需使用雄辩来检索有说服力的对象。

这是相同的语法,雄辩地使用查询构建器。

 
sebastiansulinski

关键是,它不仅仅是我以后的模型 - 让我重复一个问题:

有没有办法在查询生成器上更改提取模式PDO::FETCH_CLASS并指定要用于集合中每个项目的确切类?

 
pmall
 pmall
1年前(574,845 XP)

真的我不会这样做 Laravel的许多部分使用查询构建器,不知道如果你改变了会发生什么。

也许我们可以将您重定向到另一种方法,如果您将显示您想要做的事情的实际示例(使用代码)。

 
sebastiansulinski

那么 - 如上所述 - fetchMode每个扩展的类都有一个公共方法Connection,这表明这可能是可能的 - 不知道是否有DB立面。

从来没有 - 我已经解决了我使用雄辩的问题,但只是想知道是否有任何方法 - 这当然是一个有用的补充,因为我可以想到至少在几种情况下更改提取模式(不只是PDO::FETCH_CLASS)会很方便 - 即使是StdClass

 

 

pmall
 pmall
1年前(574,845 XP)

真的我认为你应该保持这些东西。我可以想象一个未来的开发人员试图重构你的应用程序消费两天了解你改变了查询构建器的提取模式:-)


 

它不是永久地更改它 - 只在每个查询的基础上。别担心 - 没有必要再发布。

 
JarekTkaczyk
 JarekTkaczyk
1年前(394,250 XP)

@sebastiansulinski无法以连接方式更改提取模式。但是,这可能会对你有所帮助:

$arrayFromBuilder = DB::table('some_table')->get();

$collectionOfModels = SomeModel::hydrate($arrayFromBuilder);

它将返回SomeModel包含实例的SomeModel集合。从原来的帖子我猜这是你需要的?

 
sebastiansulinski

感谢@JarekTkaczyk - 是的 - 当谈到这个模型可以工作。耻辱没有办法在运行时更改单个查询的提取模式,因为有一些非常有用的,我以前用过任何主流框架。

 
bobbybouwmann
 bobbybouwmann
1年前(855,025 XP)

您可以随时编写自己的数据库驱动程序;)

 
athahersirnaik
 athahersirnaik
1年前(7,920 XP)

这可能会在laravel中5.3

查看拉请求。 https://github.com/laravel/framework/pull/10552

 
thomaskim
thomaskim
1年前(164,740 XP)

如果你想把它转换成一个集合,你可以这样做。我不知道这是他的问题。

$array = DB::table('users')->get();
$collection = collect($array);


来自 https://laracasts.com/discuss/channels/general-discussion/query-builder-to-return-collection-of-spec...


普通分类: