给出一个模型和一个id。获取该行的所有$ fillable数据。这包括来自模型之间关系的数据,因此如果与另一个模型存在关系。它还需要从相关模型中获取所有可填充数据。如果相关模型有关系,我们也需要遵循这些关系。
到目前为止,我已经尝试了很多东西,但它们都遵循相同的一般思维过程。到目前为止,我最近的尝试是在下面。更多信息:每个模型都保护了$ fillable和一个名为$ getPossibleRelations的数组,其中包含该模型使用的关系名称列表。可填充的__get函数以及模型上的可能关系。
$item = $model->where('id',$id);
function deepProcess($item) {
$fillable = $item->find(1)->getFillable();
$item = call_user_func_array(array($item, 'select'), $fillable);//select only fillable fields
$possibleRelations = $item->find(1)->getPossibleRelations();
foreach ($possibleRelations as $rel) {//eager load any possible relations
$item = $item->with([
$rel => function($query) {//reaches here ok, below recursion fails
$query = deepProcess($query);
}
]);
}
return $item;
}
$item = deepProcess($item)->get()->toArray();
dd($item);
在急切加载中,查询需要以某种方式循环回同一个函数。它需要确保它不会通过它已经通过的关系返回(我在之前的尝试中使用了get_class()来检查它。)
我对如何做到这一点有点失落
这是我做的另一次尝试,这种尝试在许多显而易见的方面都存在缺陷。
$item = $model->where('id',$id);
$checkedModels = [];
$result = [];
function deepFetch($item,&$result,&$checkedModels,$className) {
if (in_array($className,$checkedModels)) {
return; //we've already added bits from this model
}
array_push($checkedModels,$className);
if($className == 'Illuminate\Database\Eloquent\Collection') {
dd($item);
}
var_dump('loop count');
$fillable = $item->get()[0]->getFillable();
$possibleRelations = $item->get()[0]->getPossibleRelations();
foreach($item->select($fillable)->get() as $row) {
array_push($result,$row);
}
foreach ($possibleRelations as $rel) {
dd($item->get());
$newItem = $item->get()->$rel;
deepFetch($newItem,$result[$rel],$checkedModels,get_class($newItem));
}
}
deepFetch($item,$result,$checkedModels,get_class($model));
答案 0 :(得分:0)
C:\boost\boost_1_66_0\libs\python\example\tutorial>bjam toolset=msvc --verbose-test test
...patience...
...found 1029 targets...
...updating 4 targets...
msvc.link.dll hello_ext.pyd
Fatal error LNK1181: cannot open input file 'boost_python.lib'
call "C:\Users\YANNIC~1\AppData\Local\Temp\b2_msvc_10.0_vcvarsall_x86.cm
d" >nul
link /NOLOGO /INCREMENTAL:NO /DLL /NOENTRY /DEBUG /MACHINE:X86 /MANIFEST/sub
system:console /out:"hello_ext.pyd" /IMPLIB:"hello_ext.pdb" /LIBPATH:"C:\Python34\l
ibs" @"hello_ext.pyd.rsp"
IF %ERRORLEVEL% NEQ 0 EXIT %ERRORLEVEL%
...failed msvc.link.dll hello_ext.pyd hello_ext.pdb...
...skiped <p.>hello for lack of <p.>hello_ext.pyd...
...failed updating 2 targets...
...skipped 2 targets...
...updated 2 targets...
大部分是作品,很粗糙,而且我无法使select语句工作(这就是为什么它被注释掉了,并且使用了一个简单的(关系)。它虽然适用于我的目的