Laravel,通过关系递归返回单个模型行的所有数据

时间:2018-03-13 20:21:56

标签: php laravel eloquent

给出一个模型和一个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));

1 个答案:

答案 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语句工作(这就是为什么它被注释掉了,并且使用了一个简单的(关系)。它虽然适用于我的目的