Объект отношений Laravel Eloquent устарел, хотя данные в базе данных верны - PullRequest
0 голосов
/ 10 декабря 2018

Я использую Laravel 5.7 и имею отношение один к одному между двумя красноречивыми моделями.

У меня есть эта простая функция, которая работает хорошо, и правильные значения сохраняются вбаза данных:

public function saveMarketingOriginInfo(Contact $contact, $data) {
    $contact->marketingOrigin()->create($data);        
    $this->makeOtherChangesByReference($contact->marketingOrigin);
    $contact->marketingOrigin->save();
    return $contact->marketingOrigin; 
}

Однако при написании функционального теста для него я заметил, что возвращаемый объект устарел (в его свойствах нет правильных значений).

Мои тесты пройдут, только если я изменю оператор возврата на return \App\Models\MarketingOrigin::find($contact->id);.

(MarketingOrigin использует 'contact_id' в качестве первичного ключа.)

Что я делаю не так?

Как вернуть тот же объект, который был только что сохранен в предыдущей строке ($contact->marketingOrigin->save();), без запроса на чтение базы данных (find())?


Обновление для ответана комментарии:

protected $table = 'marketing_origins';//MarketingOrigin class
protected $primaryKey = 'contact_id';
protected $guarded = [];
public function contact() {
    return $this->belongsTo('App\Models\Contact');
}

Тест:

public function testSaveMarketingOriginInfo() {
    $helper = new \App\Helpers\SignupHelper();
    $contactId = 92934;
    $contact = factory(\App\Models\Contact::class)->create(['id' => $contactId]);
    $leadMagnetType = 'LMT';
    $audience = 'a60907';
    $hiddenMktgFields = [
        'audience' => $audience,
        'leadMagnetType' => $leadMagnetType
    ];
    $result = $helper->saveMarketingOriginInfo($contact, $hiddenMktgFields);
    $this->assertEquals($result->contact_id, $contactId, 'contact_id did not get saved');
    $this->assertEquals($result->campaignId, '6075626793661');
    $this->assertEquals($result->leadMagnetType, $leadMagnetType);
    $marketingOrigin = \App\Models\MarketingOrigin::findOrFail($contactId);
    $this->assertEquals($marketingOrigin->adsetId, '6088011244061');
    $this->assertEquals($marketingOrigin->audience, $audience);
    $this->assertEquals($marketingOrigin, $result, 'This is the assertion that fails; some properties of the object are stale');
}

1 Ответ

0 голосов
/ 10 декабря 2018

Это потому, что отношения еще не загружены.

Вы можете попробовать $contact->load('marketingOrigin'); чтобы загрузить отношения:

public function saveMarketingOriginInfo(Contact $contact, $data) {
    $contact->marketingOrigin()->create($data);        
    $this->makeOtherChangesByReference($contact->marketingOrigin);
    $contact->marketingOrigin->save();
    $contact->load('marketingOrigin'); // <---- eager load the relationship
    return $contact->marketingOrigin; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...