2

私はCodeigniterからやってきたLaravelにかなり慣れていません。ほとんどの場合、私はそれが本当に好きですが、Eloquentに頭を悩ませることはできません。

このような簡単なクエリを実行したい場合:

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

私はこのようなことをしようとします(「に属する」を使用して):

$site = Site::with('tweeter')->find($site_id);

しかし今、私は2つのクエリと実際には必要のない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を使用して作成したいクエリを作成する方法はありますか?

4

2 に答える 2

3

私は実際にこの振る舞いが有利だと思っています。これを考慮してください(例を変更します)。そのため、多くのサイトがあり、それぞれに多くのツイーターがあります。各サイトのDBには多くの情報があります。多くの列があり、一部のサイトには多くのテキスト/データを含むテキスト列があります。

クエリは自分のやり方で行います。

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

2つの欠点があります。

  1. 大量の冗長データを取得します。同じサイトのツイーターで取得する各行には、1回だけ必要な同じサイトデータが含まれるため、PHPとDB間の通信に時間がかかります。
  2. foreach(tweeter_of_this_site)はどのように行いますか?ある種のリストにすべてのサイトを表示してから、各サイト内にすべてのツイーターを表示すると思います。これを行うには、いくつかのカスタムロジックをプログラムする必要があります。

ORMアプローチを使用すると、これらの問題の両方が解決されます。サイトデータを取得するのは1回だけで、これを実行できます。

foreach ($sites as $site) {
    foreach($site->tweeters as $tweeter) {}
}

私も言っているのは、それと戦わないでください!私はかつて言った人でした:なぜ私はORMを使うのでしょうか、私は自分のSQLをコーディングすることができます、ありがとう。今私はLaravelでそれを使っています、そしてそれは素晴らしいです!

于 2013-01-03T11:26:02.707 に答える
0

Eloquentは常にFluentの拡張と考えることができます。

発生している問題は、find()コマンドが原因で発生します。idあいまいになるテーブル名なしで使用します。

これは文書化された問題です: https ://github.com/laravel/laravel/issues/1050

探しているコマンドを作成するには、次のようにします。

$site = Site::join('tweeter', 'tweeter.id', '=', 'site.tweeter_id')->where('site.id', '=', $site_id)->first($fields);

もちろん、問題の修正が採用されると、join()-> find()の構文は正しくなります。

于 2013-01-02T22:45:12.717 に答える