Laravel Seeder偶尔跳过记录

时间:2019-06-08 18:01:15

标签: php mysql laravel eloquent

我在两种模型(联系人和用户)上建立了一对一的关系。在意识到某些联系人没有与之关联的用户之后,我试图编写一个能够捕获所有这些情况并创建用户模型并将其与联系人关联的种子器。但是,此脚本每次仅捕获大约一半的联系人。反复运行它最终可以完成工作,但是我想知道是什么原因造成的。

型号:

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 :(得分:0)

您可以使用doesntHave()方法。 看一下Querying Relationship Absence

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();

并执行创建新用户并将其与联系逻辑相关联