Как обновить отношение HasOne, когда отношение HasMany также существует с той же моделью? - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь определить оба отношения HasMany и HasOne между теми же двумя моделями в Eloquent.

Мой Organization класс имеет много Contact с:

public function contacts()
{
    return $this->hasMany(Contact::class);
}

И мой класс Contact также отражает эти отношения:

public function organization()
{
    return $this->belongsTo(Organization::class);
}

Но также у каждого Organization есть ровно один «основной» Contact. Я использую столбец таблицы organizations.primary_contact_id, чтобы определить, какой из них:

public function primaryContact()
{
    return $this->hasOne(Contact::class, 'id', 'primary_contact_id');
}

Отсюда я застрял. Обратная связь в Contact уже существует, поэтому я написал другую функцию, которая, я думаю, сработает, полагая, что если я обновлю значение в родительской таблице, Eloquent естественным образом получит соответствующую запись в таблице контактов, так как я определил отношение:

/**
 * @param \App\Contact
 */
public function setPrimaryContact($contact)
{
    $this->primary_contact_id = $contact->id;
    $this->save;
}

Но это не так:

>>> $org = Organization::find(17)
=> App\Organization {#2923
     id: 17,
     name: "Test Org",
     primary_contact_id: 33,
   }
>>> $alice= $org->primaryContact
=> App\Contact {#2938
     id: 33,
     organization_id: 17,
     fname: "Alice",
     lname: "Abbot",
   }
>>> $bob = Contact::find(34)
=> App\Contact {#2939
     id: 34,
     organization_id: 17,
     fname: "Bob",
     lname: "Baker",
   }
>>> $org->setPrimaryContact($bob)
=> null
>>> $org
=> App\Organization {#2923
     id: 17,
     name: "Test Org",
     primary_contact_id: 34,
     primaryContact: App\Contact {#2938
       id: 33,
       organization_id: 17,
       fname: "Alice",
       lname: "Abbot",
     },
   }

Вы можете видеть, что setPrimaryContact($bob) выполнено нормально, поскольку primary_contact_id обновлено до id Боба, но primaryContact все еще перечисляет Алису.

Почему primaryContact не возвращает правильный объект?

1 Ответ

0 голосов
/ 11 января 2019
  • Ваш метод setPrimaryContact не обновит вашу таблицу, потому что вы вызываете $this->save, а не $this->save(), save - это метод
  • После $org->setPrimaryContact($bob) вы должны позвонить $org-> primaryContact->refresh(), чтобы получить обновленную запись.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...