gpt4 book ai didi

Laravel - 真的很难理解 eloquent

转载 作者:行者123 更新时间:2023-12-04 05:17:04 25 4
gpt4 key购买 nike

我是从 Codeigniter 过来的 Laravel 新手,在很大程度上我真的很喜欢它,但我真的无法理解 Eloquent。

如果我想做一个像这样的简单查询:

SELECT * FROM site INNER JOIN tweeter ON tweeter.id = site.tweeter_id

我尝试做这样的事情(带有“属于”):
$site = Site::with('tweeter')->find($site_id);

但是现在我有两个查询和一个并不真正需要的 IN() ,如下所示:
SELECT * FROM `site` WHERE `id` = '12' LIMIT 1

SELECT * FROM `tweeter` WHERE `id` IN ('3')

所以我尝试像这样强制加入:
$site = Site::join('tweeter', 'tweeter.id', '=', 'site.tweeter_id')->find($site_id);

现在我收到这样的错误:
SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in where clause is ambiguous

SQL: SELECT * FROM `site` INNER JOIN `tweeter` ON `tweeter`.`id` = `site.tweeter_id` WHERE `id` = ? LIMIT 1

Bindings: array (
0 => 12,
)

很明显错误在哪里,哪里需要使用“site.id = ?”之类的东西。但无论如何我都看不到让这发生?

所以我只是坚持回到流畅并使用:
DB::table('site')->join('tweeter', 'tweeter.id', '=', 'site.tweeter_id')->where('site.id','=',$site_id)->first()

我想这不是一个大问题。我只是很想了解 Eloquent 。我不禁觉得我大错特错了,并且误解了它是如何工作的。我错过了什么吗?或者它真的必须以非常特定的方式使用吗?

我想我真正的问题是:无论如何要使用 Eloquent 进行查询?

最佳答案

我实际上发现这种行为是有利的。考虑这个(我会修改你的例子)。所以我们有很多网站,每个网站都有很多推特。每个站点在数据库中都有很多信息:很多列,其中一些是带有大量文本/数据的文本列。

您按照自己的方式进行查询:

SELECT * FROM site INNER JOIN tweeter ON tweeter.id = site.tweeter_id

有两个缺点:
  • 你会得到很多冗余数据。您为同一站点的推特获得的每一行都将具有您只需要一次的相同站点数据,因此 PHP 和您的数据库之间的通信需要更长的时间。
  • 你怎么做 foreach (tweeter_of_this_site)?我猜你会在某种列表中显示所有站点,然后在每个站点内显示所有的高音扬声器。您必须编写一些自定义逻辑才能做到这一点。

  • 使用 ORM 方法可以解决这两个问题:它只获取站点数据一次,并且允许您执行以下操作:
    foreach ($sites as $site) {
    foreach($site->tweeters as $tweeter) {}
    }

    我还要说的是: 不要打它! 我曾经说过:我为什么要使用 ORM,我可以编写自己的 SQL,谢谢。现在我在 Laravel 中使用它,它很棒!

    关于Laravel - 真的很难理解 eloquent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14130338/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com