【问题标题】:When to use a model in Laravel 4何时在 Laravel 4 中使用模型
【发布时间】:2014-03-25 16:46:43
【问题描述】:

我是 Laravel 和 MVC 的新手,我正在为应该在何时何地做事而苦苦挣扎......

我有一个想要从数据库表中填充的州选择、下拉列表、字段(CA、NY、TX 等)。该数据库表很大(300 万行),因为它包含美国每个位置的信息。所以我的原始 SQL 看起来像:

select distinct state_alpha,state_numeric
from location_code
order by state_alpha;

在我的所有申请中,我将不得不多次这样做。该表也是只读的——用户永远不会插入或更新它。我最终会有类似的查询——从同一张表中提取——这将返回一个州的县、一个县的城市等。

所以我的第一个问题是:我应该为这样的东西创建一个模型吗?我很担心,因为我不知道模型在幕后是如何工作的,我不希望它不必要地从表格中读取或准备写入或其他东西。

我的下一个问题:除非您回答我的第一个问题,请您提供一个基本示例,说明我将如何完成此操作。

对不起,如果我听起来很愚蠢,但 Laravel 的文档并没有那么包容——它说明了它需要什么才能让你使用它,但它并没有说明它是如何工作的——这么多这对我来说很神奇。

【问题讨论】:

    标签: php mysql laravel laravel-4 eloquent


    【解决方案1】:

    Laravel Eloquent 类代表Object Relational Mapping 模式的实现。简而言之,它是一个将您的数据库声明性逻辑转换为面向对象代码的类。通过使用您自己的模型扩展 Eloquent,例如

    class MyModel extends Eloquent{};
    

    您正在弥合两种范式之间的差距。你可以使用 Laravel Fluent 例如:

    $product = DB:table("product")->get();
    

    这比 Eloquent 低了一步。

    认为使用这样的行查询会更好:

    SELECT * from Product:
    

    $product = Product::all();
    

    最后一个例子对于 Laravel 和 PHP OO 方法来说更自然。

    这些都是抽象,使您的数据库访问更易于使用。它们基于内置的 PHP mysql 驱动程序。当然,它也有不利的一面——主要是性能,但取决于你的标准来决定。获取数百万条记录可能会消耗资源,因此请使用一些工具来衡量性能,同时尝试不同的方法。

    除了Eloquent documentation

    你可以看一下source code

    源代码并不是那么简单,因为整个 ORM 模式的实现是开发 Laravel 时最具挑战性的任务(Taylor Otwell 引用)。

    因此,最后 - 将模型用于任何类型的非平凡数据库访问,它可以为您提供帮助。你可以通过创建自己的函数和助手来扩展一切,但首先要使用 Laravel 提供的东西。

    PS 我通过为您提供一些指南和链接来回答您的问题,您可以按照这些指南和链接了解有关 Laravel DB 访问的更多信息。

    【讨论】:

    • 鉴于桌子的大小,性能确实是我最关心的问题。你是对的,我可以衡量性能,但如果我对模型内部发生的情况有更好的理解,那么我可能能够更快地做出决定,并将这些知识应用于未来的考虑.
    • 当我声明模型时,它是在整个表上运行select * 之类的东西来解析其内容,还是只是用字段初始化对象并返回请求的数据?抱歉,如果我要打死马,我知道我可以运行一个分析器来为自己解决大部分问题,但我在安装分析器时也遇到了困难 - my other question
    • 您可以通过附加监听器来查看当前查询,例如 Event::listen("illuminate.query",function($query){dd($query)}; 并且取决于您调用的方法,您可以使用调试器进行跟踪。
    【解决方案2】:

    所以我的第一个问题是:我应该为类似的东西创建一个模型吗? 这?我很担心,因为我不知道模型是如何工作的 在被子下面,我不希望它不必要地从 表或准备将其写入或其他内容。

    您要做的就是通过某个函数抽象该查询并按需调用以确保该查询只能运行一次。它实际上只是一种方法,与框架无关。

    工作流程如下所示,

    • 应该准备一个获取记录的函数/类方法
    • 访问获取的记录时,您必须确保它们之前没有被访问过 - 只调用该函数一次,并保存其返回值。下次访问时检查该值是否不为空。
    • 最后渲染它

    我的下一个问题:除非你回答我的第一个问题,你能不能 请提供一个基本示例,说明我将如何完成此操作。

    function fetchStates() {
    
      static $result = null;
    
      // If this function has never been called before, then invoke a query
      if ($result === null) {
         $result = DB::select('select distinct state_alpha,state_numeric from location_code order by state_alpha;');
      }
    
      return $result;
    }
    

    【讨论】:

    • 那么,我会在我的模型或控制器中编写该函数吗?我将如何在我的视图中显示结果?
    • 当然,该部分属于一个模型。在控制器中,您只需简单地请求该数据并将其传递给视图。
    • 不应该在模型类中定义static $result = null;,在fetch函数之外?它似乎违背了在函数中使用它的目的,因为它每次运行时都会将其设置为 null,因此总是获取数据 - 我在这里遗漏了什么吗?
    猜你喜欢
    • 2013-09-25
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 2016-06-26
    • 1970-01-01
    • 2014-04-17
    • 2014-01-31
    相关资源
    最近更新 更多