Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Laravel doesntHave()不';与关系不存在?_Mysql_Laravel_Eloquent_Relationship - Fatal编程技术网

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
的透视表相关联,并使用雄辩的关系模型将关系关联起来,其中crates
hasMany()tracks()
方法进行编码>跟踪。一旦我用模型工厂制作了一吨板条箱。然后,我需要多次附加关系,直到满足某个条件(#未附加的查询<#)。为什么不使用Laravel的内置功能呢?