Сеялка Laravel время от времени пропускает записи - PullRequest
0 голосов
/ 08 июня 2019

У меня есть отношение один к одному на двух моделях (контакты и пользователи).Понимая, что у некоторых контактов не было пользователя, с которым я связан, я пытаюсь написать сеялку, которая перехватит все эти случаи и создаст модель пользователя и свяжет ее с контактом.Тем не менее, этот скрипт ловит только около половины контактов каждый раз.Повторный запуск в конечном итоге сделает работу, но я хотел бы знать, что вызывает это.

Модели:

use Cartalyst\Sentry\Users\Eloquent\User as SentryUserModel;
class User extends SentryUserModel {
    public function contact()
    {
    return $this->hasOne('Contact');
    }
}
class Contact extends AppModel {
    protected $table = 'contacts';
    public function user()
    {
        return $this->belongsTo('User');
    }
}

Эта сеялка работает:

public function run()
{
    $contacts = Contact::all();


    foreach($contacts as $contact)
    {
        $user = $contact->user;

        if(!$user))
        {
            //Logic for creating and associating new user with contact
            //This is only being hit for about half of the contacts without a user_id in the db.
            Log::info('Found a contact without a user.');
        }
    }
}

Мы ожидаем, что эта сеялка перехватит все контакты без пользователей, а затем выполнит логику создания пользователя, но вместо этого она отлавливает около половины контактов без пользователей и правильно создает и связывает нового пользователя.Любое понимание того, почему это происходит, будет с благодарностью.Заранее спасибо!

1 Ответ

0 голосов
/ 08 июня 2019

Вы можете использовать doesntHave() метод.Взгляните на Запрос отсутствия отношений .

public function run()
{
    $total_contacts = Contact::count();
    $total_contacts_with_user = Contact::has('user')->count();
    $total_contacts_without_user = Contact::doesntHave('user')->count();

    Log::info('Total contacts: ' . $total_contacts);
    Log::info('Total contacts with user: ' . $total_contacts_with_user);
    Log::info('Total contacts without user: ' . $total_contacts_without_user);

    Log::info('Check if this is true: ' . $total_contacts_with_user . ' + ' . $total_contacts_without_user . ' = ' . $total_contacts);
}

, если все в порядке и есть все ожидаемые контакты, получите контакты без пользователя следующим образом:

$contacts_without_user = Contact::doesntHave('user')->get();

и выполните создание и связывание нового пользователя сконтактная логика

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...