我正在创建一些数据库种子,我遇到一个问题,将相关记录附加到我设置的数据透视表中。
我有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
答案 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);
});
});