【问题标题】:Eloquent ORM Model Two or More TableEloquent ORM 模型两个或多个表
【发布时间】:2018-04-12 21:17:06
【问题描述】:

我有一个我无法处理的问题。我有一个 News 表,包括 TitleID、TextID、ImageID。还有另外三个表格 Titles, Texts, Images。我想把所有这些都放在一个模型中。但是当我尝试时,得到的结果类似于数组中的数组。但我想要这样:

[ News: [ { ID, Title, Text, Image } ] ]

Eloquent ORM 的响应如下:

[ News: [ { ID, Title: [ID, Title], Text: [ID, Text], Image: [ID, Image] } ] ]

数据库结构

新闻 =>

+-----------------+-------------+------+-----+---------+----------------+
| Field           | Type        | Null | Key | Default | Extra          |
+-----------------+-------------+------+-----+---------+----------------+
| ID              | int(11)     | NO   | PRI | NULL    | auto_increment |
| TitleID         | int(11)     | NO   |     | NULL    |                |
| TextID          | int(11)     | NO   |     | NULL    |                |
| ImageID         | int(11)     | NO   |     | NULL    |                |
| CatID           | int(11)     | NO   |     | NULL    |                |
| OlusturmaZamani | datetime    | NO   |     | NULL    |                |
| YayinZamani     | datetime    | NO   |     | NULL    |                |
| DuzenlemeZamani | datetime    | YES  |     | NULL    |                |
| Onay            | tinyint(11) | NO   |     | NULL    |                |
| Hit             | int(11)     | YES  |     | NULL    |                |
+-----------------+-------------+------+-----+---------+----------------+

标题 =>

+------------+---------+------+-----+---------+----------------+
| Field      | Type    | Null | Key | Default | Extra          |
+------------+---------+------+-----+---------+----------------+
| ID         | int(11) | NO   | PRI | NULL    | auto_increment |
| TitleText  | text    | NO   |     | NULL    |                |
+------------+---------+------+-----+---------+----------------+

其他表,如标题表。

【问题讨论】:

  • 你能显示代码吗?
  • 看来你需要一个经典的 SQL 加入我
  • 我认为您需要声明您的 News 模型与其他模型(标题、文本和图像)之间的关系。然后,您需要将 append titletextimage 属性添加到您的 News 模型。
  • 首先,为什么要将标题或文本与新闻表分开?您认为许多新闻可以具有相同的文本或标题吗?

标签: database laravel orm eloquent mariadb


【解决方案1】:

尝试预先加载。

如果您已经创建了 News、Titles、Text 和 Image 表之间的关系,您可以通过eager loading 加载关系模型。

$news = News::with('title','text','image)->find(1);

【讨论】:

  • 我已经尝试过了,但它给出了数组中的数组。我希望它作为单一新闻的对象。
【解决方案2】:

您将 Title 和 Text 提取到他们自己的表中是有原因的吗?

适合您的解决方案类似于您在这篇文章中看到的:

Add a custom attribute to a Laravel / Eloquent model on load?

针对您的示例进行了调整:

假设您将关系更改为“titleTable”,只是为了避免冲突

class News extends Eloquent {

    protected $appends = array('title');

    public function getTitleAttribute()
    {
        return $this->titleTable->TitleText;  
    }
}

【讨论】:

    【解决方案3】:

    听起来ORM“过度规范化”。 news 属性(如标题、文本和图像)没有合理的理由通过“id”放在单独的表 JOINed 中。

    “急切加载”听起来像是一种拼凑,让人感觉这些列在News 表中,而实际上它们不在。这会导致不必要的低效率。

    【讨论】:

    • 感谢您的回答。我现在同意你的看法。它会导致效率低下。
    • ORM 不会让你过度规范化。那是编写代码的人做出的设计决定..
    • @ChrisPhillips - 感谢您的评论。你能给出一些表征这个决定的关键词吗?这样我就可以说“...”而不是“过度规范化”。 (这不是唯一一个这样的问题。)
    • @RickJames 哦,我认为“过度规范化”是一个很好的描述。表结构是“过度规范化的”,而不是 ORM 本身。如果记录具有您知道将在结果中查看的关联模型(例如 user::with('profile')),您会使用“eager loading”。它允许 ORM 预先进行更有效的查询。
    猜你喜欢
    • 2021-04-08
    • 1970-01-01
    • 2020-11-08
    • 2015-10-29
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    相关资源
    最近更新 更多