tojson()不返回所有相关模型

时间:2018-04-10 11:36:07

标签: laravel eloquent frontend laravel-5.5 laravel-eloquent

我正在研究laravel 5.5项目

我有四张表如下: -

1-主题模型(具有以下关系)

public function types()
{
    return $this->belongsToMany('App\Types');
}
public function areas()
{
    return $this->belongsToMany('App\Area');
}
public function articles()
{
    return $this->hasMany('App\Article');
}

2-区域和类型与主题模型有很多关系

public function subjects()
{
    return $this->belongsToMany('App\Subjects');
}

3-文章与主题有1对多的关系

public function subjects()
{
    return $this->belongsTo('App\Subjects');
}

以下控制器将按关键字搜索主题,选择类型或区域,并使用toJson()将值返回为json并返回结果以查看: -

public function search(Request $request)
{
    //start search//
    $get_Subjects = new Subject();
    $get_Subjects = $get_Subjects ->newQuery();

    if($request->term != '')
    {
       $get_Subjects->with('articles')->whereHas('articles', function ($query) use ($request){
            $query->where('title', 'LIKE', '% '.$request->term.' %')
            ->orwhere('abstract', 'LIKE', '% '.$request->term.' %')
            ->orwhere('fullCitation', 'LIKE', '% '.$request->term.' %');
        })
        ->where(function($query) use ($request){

            $query->where('name', 'LIKE', '%'.$request->term.'%');
        });
    }if($request->area != '28')
    {
        // search for the selected area
        $get_Subjects->with('areas')->whereHas('areas', function($query) use ($request){
            $query->where('area_id', $request->area);
        });
    }
    if($request->type!= '36')
    {
        // search for the selected types
        $get_Subjects->with('types')->whereHas('types', function($query) use ($request){
            $query->where('type_id', $request->type);
        });
    }

    $subjects = $get_Subjects->tojson();
    return View::make('public.search', compact('subjects'));
}

问题是当我按关键字搜索时,返回的json只包含相关文章,如果我按区域搜索我只获得相关区域()

如果我没有使用刀片的json和访问变量,我可以访问所有相关的模型,即使它是相同的查询 我试图使用load()但它没有工作

任何帮助都是有价值的

============更新===========

我尝试使用load()如下

$subjects= $get_subjects->get();
$subjects= $subjects->load('articles', 'areas', 'types')->tojson();

按关键字搜索时,json确实有相关关系 但他们是空的

按区域或类型搜索时,json确实有相关关系

这意味着如果我只在主题表中搜索哪个是第一种情况我不会得到相关的模型

请你的帮助

1 个答案:

答案 0 :(得分:0)

您是否尝试在->get()方法之前添加->toJson()方法?

$subjects = $get_Subjects->get()->toJson();

get()将运行查询并返回模型。 toJson()应该按照您的预期运作。

更新

我会像这样编写你的代码。 (我还没有测试过这个)。

好像你正在以错误的方式使用whereHas。主题表应包含area_idtype_id字段,因此不需要whereHas ...这可能不是这种情况,但似乎应该基于你提供的信息。

public function search(Request $request)
{
    $get_Subjects = new Subject();
    $get_Subjects = $get_Subjects ->newQuery();
    $with = [];


    if($request->term != '') {
       $with[] = 'articles';
       $subjects = $get_Subjects->whereHas('articles', function ($query) use ($request){
            $query->where('title', 'LIKE', '% '.$request->term.' %')
            ->orwhere('abstract', 'LIKE', '% '.$request->term.' %')
            ->orwhere('fullCitation', 'LIKE', '% '.$request->term.' %');
        })
        ->where('name', 'LIKE', '%'.$request->term.'%');
    }

    if($request->area != '28') {
        $with[] = 'areas';
        $get_Subjects->where('area_id', $request->area);
    }

    if($request->type!= '36') {
        $with[] = 'types';
        $get_Subjects->where('type_id', $request->type);
    }

    $subjects = $get_Subjects->with($with)->get()->toJson();

    return View::make('public.search', compact('subjects'));
}