如何从Laravel的第二个表中获取重新获取的数据?

时间:2016-09-03 09:21:52

标签: php laravel laravel-5 eloquent laravel-5.2

我有两个表:usersstudents。这些表按字段连接:

users.id = studetns.user_id

我尝试使用请求获取信息:

$students = User::where(function ($query) use ($request) {

            // Filter by name
            if (($term = $request->get("name"))) {
                $query->where('name', 'like', '%' . $term . '%');
                $query->where('secondname', 'like', '%' . $term . '%');
            }

        })->with("details")->where('type', '2')->orderBy('name', 'desc')->get();
        dd($students);

您可以看到with("details"),必须连接表格。

我的模型User是:

public function details()
    {
        return $this->hasOne('App\Student', 'user_id', 'id');
    }

当我执行查询时,我收到错误:

select * from `users` where `type` = 2 order by `name` desc)

这意味着没有与第二个表连接,其中有name个fiels。

2 个答案:

答案 0 :(得分:2)

如果namesecondname位于students表中,请尝试以下操作:

$students = User::where('type', '2')
     ->with(['details' => function ($query) use ($request) {

        if (!empty($request->name)) {
            $query->where('name', 'like', '%'.$request->name.'%');
            $query->orWhere('secondname', 'like', '%'.$request->name.'%');
        }

        $query->orderBy('name', 'desc');
    }])->get();

这将加载并订购所有students(或者,如果$request->name变量存在,则所有students都按其值进行过滤。)

PS:正如@ jedrzej.kurylo所说,如果你想在orWhere栏中找到namesecondname}使用SELECT (@a:=@a+1 ) AS sl, student_id, student_name, schl_id, class_id FROM (SELECT @a:=0) as BSS, trans_student AS TS WHERE TS.status= 1 AND academic_year = '2016-2017' ORDER BY sl ASC LIMIT 0,15 运算符是有道理的

答案 1 :(得分:1)

通过在传递给 where()的回调中按名称过滤来加载用户模型的方式会导致错误,因为没有名称< 用户表中的/ strong>列,因此根本无法正常工作。

如果您要加载在相关学生表中提供姓名的用户,则需要使用 whereHas()

$students = User::whereHas('details', function ($query) use ($request) {            // Filter by name
        if (($term = $request->get("name"))) {
            $query->where('name', 'like', '%' . $term . '%');
            $query->where('secondname', 'like', '%' . $term . '%');
        }
    })
    ->join('details', 'details.user_id', '=', 'users.id')
    ->with("details")
    ->where('type', '2')
    ->orderBy('name', 'desc')
    ->get();

我还认为您可能希望名称或第二名 $ term 匹配的用户,因此我建议您替换:

  $query->where('name', 'like', '%' . $term . '%');
  $query->where('secondname', 'like', '%' . $term . '%');

  $query->where('name', 'like', '%' . $term . '%');
  $query->orWhere('secondname', 'like', '%' . $term . '%');