4

次のフィールドを持つ次のテーブルがあります。

person : ID、姓、名

phonebookentry : ID、名前

次の2つのモデルがあります。

class Person extends Eloquent
{

    public static $table = 'personphonebookentries';

    public function phonebookentry()
    {
        return $this->has_one('Phonebookentry', 'id');
    }

}

class Phonebookentry extends Eloquent
{
     public function person()
    {
        return $this->belongs_to('Person', 'id');
    }

}

特定の名または特定の番号を持つすべての人を取得する方法がわかりません。

私はもう試した :

Person::or_where('firstname', 'LIKE', '_name_')->phonebookentry()->or_where('number', '=', '_number_')->get();

それを行う方法を見つけるのに助けが必要です:)

助けてくれてありがとう!

4

1 に答える 1

3

この場合、2 番目のクエリであるリレーションに基づいて People の結果を制限したいので、単純なリレーションは役に立ちません。

このスキーマでは、phonebookentry テーブルに person_id を追加する場合、次のような結合を行う必要があります。

Person::join('phoneboookentry', 'person.id', '=', 'phoneboookentry.person_id')
    ->where('person.firstname', 'LIKE', "%$name%")
    ->or_where('phoneboookentry.number', '=', $number)
    ->get('person.*');

ただし、すべての 1 対 1 の関係について、スキーマについて考えることが強く推奨されており、テーブルをマージした方がよい可能性が高くなります。通常、過剰正規化は役に立ちません。

また、いくつかのその他のポイント:

  1. テーブルとして「personphonebookentries」がありますが、person テーブルがあると言っていました。
  2. id を外部キーとして指定することは良いことではありません。2 つのテーブルを同期させておくと、問題が発生するだけです。
  3. どこでも使用するのは不必要であり、間違っていますor_where()。必要なときに使用するだけです。
  4. クエリ オブジェクトで作業しているモデルでクエリまたはリレーショナル メソッドを実行した時点から、クエリ オブジェクトでリレーショナル メソッドを実行することはできません。( phonebookentry()) 結果モデルが必要です。
于 2012-12-19T22:20:34.223 に答える