Laravel doesntHave()与关系不存在?

时间:2017-10-01 03:36:57

标签: mysql laravel eloquent relationship

我正在创建一些数据库种子,我遇到一个问题,将相关记录附加到我设置的数据透视表中。

我有User,Track,Crate。

用户可以拥有许多板条箱,箱子可以有很多轨道。许多曲目可以属于许多板条箱。

Crate Model:

public function tracks()
{
    // Bring me a crate of those tracks dat boi
    return $this->hasMany(Track::class, 'crate_id');
}

我能够附加记录但显然因为我已经设置了crate_id和amp; track_id作为主要保持(以防止各种用户malarky)如果我运行我的设计良好的播种命令行:

$tracks->each(function ($track) { 
    $crate = App\Crate::inRandomOrder()->limit(1)->get(); 
    $track->crate()->attach($crate);
});

我真的只能运行一次或两次。在那之后它就会失败,好吧,因为有关主键的充分理由。

所以我认为将whereDoesntHave方法放入查询只会拉动它们未附加到任何此类音轨ID的板条箱。 crate_id,然后选择其中一个。

它似乎不起作用。所以我退回并在修补程序中运行代码:

DB::table('crates')->doesntHave('track')->get();

我明白了:

BadMethodCallException with message 'Call to undefined method Illuminate\Database\Query\Builder::doesntHave()'

利用&修改此示例: https://laravel.com/docs/5.5/eloquent-relationships#querying-relationship-absence

2 个答案:

答案 0 :(得分:1)

我不完全确定你要做什么,也许你解释说我可以提出一个更好的方法来生成种子数据。

错误的原因是,当您尝试在用于运行原始SQL的doesntHave()外观上调用DB方法时,会在模型上定义Eloquent关系。如果您像这样调整代码,那么你应该很好,

App\Crate::doesntHave('track')->get();

答案 1 :(得分:0)

所以我相信我使用的很多语言都有点困难,但我设法想出一些有点创意的东西。使用php catch / try结合do / while我能够继续保持冷静,所以我可以随机附加一些记录。我甚至能够修补这个。

App\Track::chunk(50, function ($tracks){
    $tracks->each(function ($track){
        $attempts = 0; // Reset Each Attepts per track
        do { 
            try { 
                $track->crate()->attach(App\Crate::inRandomOrder()->limit(1)->get()); 
                // Attempt to attach a track to a random crate.
            }
                catch (Exception $e) { 
                    $attempts++; 
                    // If that doesn't work then 
                    continue; 
                } 
                break; 
            } 
        while($attempts < 2);
    });
});