Mysql Laravel doesntHave()不';与关系不存在?
我正在创建一些数据库种子,但在将相关记录附加到已设置的数据透视表时遇到了一个问题 我有用户、轨道、板条箱 一个用户可以有许多板条箱,一个板条箱可以有许多轨道。许多轨道可以属于许多板条箱 板条箱型号:Mysql Laravel doesntHave()不';与关系不存在?,mysql,laravel,eloquent,relationship,Mysql,Laravel,Eloquent,Relationship,我正在创建一些数据库种子,但在将相关记录附加到已设置的数据透视表时遇到了一个问题 我有用户、轨道、板条箱 一个用户可以有许多板条箱,一个板条箱可以有许多轨道。许多轨道可以属于许多板条箱 板条箱型号: public function tracks() { // Bring me a crate of those tracks dat boi return $this->hasMany(Track::class, 'crate_id'); } 我可以附加记录,但很明显,如果我
public function tracks()
{
// Bring me a crate of those tracks dat boi
return $this->hasMany(Track::class, 'crate_id');
}
我可以附加记录,但很明显,如果我运行我精心设计的播种命令行,我已经将板条箱id和跟踪id设置为主要保存(以防止各种用户恶意):
$tracks->each(function ($track) {
$crate = App\Crate::inRandomOrder()->limit(1)->get();
$track->crate()->attach($crate);
});
我真的只能运行一两次。在那之后,它就失败了,因为关于主键有很好的理由
因此,我认为将where-doesnthave方法应用到查询中,只会在没有附加到任何轨道id和板条箱id的情况下提取板条箱,然后从中随机选择一个
它似乎不起作用。因此,我后退并在tinker中运行代码:
DB::table('crates')->doesntHave('track')->get();
我明白了:
BadMethodCallException with message 'Call to undefined method Illuminate\Database\Query\Builder::doesntHave()'
利用并修改以下示例:
我不能完全确定您想做什么,如果您解释一下,我可以建议一种更好的方法来生成种子数据 错误的原因是,当您试图调用用于运行原始SQL的
DB
facade上的doesntHave()
方法时,在模型上定义了雄辩的关系。如果你像这样调整你的代码,你应该很好
App\Crate::doesntHave('track')->get();
所以我相信我使用的很多语言都有点难,但我还是设法想出了一些有创意的东西。使用php catch/try和do/while,我可以继续并保持冷静,这样我就可以随机附加一些记录。我甚至可以在tinker中运行这个
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);
});
});
App\Track::chunk(50,函数($tracks){
$tracks->each(函数$track){
$attempts=0;//重置每个曲目的每个尝试
做{
试试{
$track->crater()->attach(App\crater::inRandomOrder()->limit(1)->get());
//尝试将轨道连接到随机板条箱。
}
捕获(例外$e){
$s++;
//如果那不行的话
继续;
}
打破
}
而(<2);
});
});
我基本上是在尝试使用php artisan tinker(因为hackerman)植入测试数据,以帮助构建和测试我的各种项目功能。在这个特殊的例子中,我创建了一个crates
和tracks
表,并将这两个表与cratet_track
的透视表相关联,并使用雄辩的关系模型将关系关联起来,其中crateshasMany()按照tracks()
方法进行编码>跟踪。一旦我用模型工厂制作了一吨板条箱。然后,我需要多次附加关系,直到满足某个条件(#未附加的查询<#)。为什么不使用Laravel的内置功能呢?