Php 在多个whereHas上的什么地方

Php 在多个whereHas上的什么地方,php,laravel,laravel-5,eloquent,Php,Laravel,Laravel 5,Eloquent,我需要能够同时对模型及其多个关系运行where查询。目前我是这样做的,为了一个单一的关系 $users = $users->whereHas('contacts', function ($query) use ($request) { $query->where('name', 'like', '%' . $request->input('filters_search') . '%') ->orWhere('contact_name', 'like', '

我需要能够同时对模型及其多个关系运行where查询。目前我是这样做的,为了一个单一的关系

$users = $users->whereHas('contacts', function ($query) use ($request) {
    $query->where('name', 'like', '%' . $request->input('filters_search') . '%')
    ->orWhere('contact_name', 'like', '%' . $request->input('filters_search') . '%');
);
因此,这将搜索我的
user.name
contact.name
字段以获得搜索输入,但我需要能够搜索多个关系,而不仅仅是
contacts
。像这样的

$users = $users->whereHas(['contacts','photos','status'], function ($query) use ($request) {
    $query->where('name', 'like', '%' . $request->input('filters_search') . '%')
    ->orWhere('contact_name', 'like', '%' . $request->input('filters_search') . '%');
);
这样我就可以在用户、联系人、照片和状态表/关系中搜索搜索输入


实现这一点的最干净/最好的方法是什么?

如果您恰好在所有表中搜索相同的列,您可以将闭包提取到一个变量:

$closure = function ($query) use ($request) {
    $query->where('name', 'like', '%' . $request->input('filters_search') . '%')
    ->orWhere('contact_name', 'like', '%' . $request->input('filters_search') . '%');
}
但您仍然需要独立地查询每个关系:

$users->whereHas('contacts', $closure)
      ->orWhereHas('photos', $closure)
      ->orWhereHas('status', $closure);

如果您恰好在所有表中搜索相同的列,则可以将闭包提取到变量:

$closure = function ($query) use ($request) {
    $query->where('name', 'like', '%' . $request->input('filters_search') . '%')
    ->orWhere('contact_name', 'like', '%' . $request->input('filters_search') . '%');
}
但您仍然需要独立地查询每个关系:

$users->whereHas('contacts', $closure)
      ->orWhereHas('photos', $closure)
      ->orWhereHas('status', $closure);
你应该试试这个:

$users = $users->whereHas('photos','status', function($query) {
    $query->where('name', 'like', '%' . $request->input('filters_search') . '%');
});
$users = $users->whereHas('contacts', function($query) use ($request) {
    $query->where('contact_name', 'like', '%' . $request->input('filters_search') . '%');
});
您应该尝试以下方法:

User::where('name', 'like', '%' . $request->input('filters_search') . '%')
->whereHas('contacts', function($query) use ($request) {
    $query->where('contact_name', 'like', '%' . $request->input('filters_search') . '%');
})
->get();
你应该试试这个:

$users = $users->whereHas('photos','status', function($query) {
    $query->where('name', 'like', '%' . $request->input('filters_search') . '%');
});
$users = $users->whereHas('contacts', function($query) use ($request) {
    $query->where('contact_name', 'like', '%' . $request->input('filters_search') . '%');
});
您应该尝试以下方法:

User::where('name', 'like', '%' . $request->input('filters_search') . '%')
->whereHas('contacts', function($query) use ($request) {
    $query->where('contact_name', 'like', '%' . $request->input('filters_search') . '%');
})
->get();

您在所有表中都有姓名和联系人姓名?你认为这到底能起什么作用?如果它与其中任何一个匹配?如果它与给定的
或where
中的任何一个匹配,则为是。它不必将它们全部匹配。
因此这将搜索我的user.name和contact.name字段中的搜索输入
。不,没有。您的第一个查询尝试搜索contact.name和contact.contact\u name。在用户表上未搜索任何内容,因为您的两个条件都在whereHas闭包内。您的所有表中都有name和contact_name吗?你认为这到底能起什么作用?如果它与其中任何一个匹配?如果它与给定的
或where
中的任何一个匹配,则为是。它不必将它们全部匹配。
因此这将搜索我的user.name和contact.name字段中的搜索输入
。不,没有。您的第一个查询尝试搜索contact.name和contact.contact\u name。在用户表上未搜索任何内容,因为您的两个条件都在whereHas闭包内。我在闭包中尝试了此操作,但我只是得到了有关数据库中不存在的列名的错误,然后您在这些相关表中没有contact_name和name。。。它们需要存在才能使这种类型的查询起作用,我只是根据你的问题的例子来说明。我不太确定如何构造我的问题,所以请解释一下我需要什么。基本上,我需要能够搜索一个模型及其与关键字的多个关系,如果其中任何一个存在,则返回主模型。例如,在搜索栏中键入一个用户,它将搜索该用户、用户联系人、用户配置文件,如果其中任何一个返回true,则返回该用户。您仍然需要指定要搜索的列。如果相关表中没有name和contact_name列,则无法尝试在whereHas闭包中搜索这些列。我有要搜索的列的名称,但并非每个表中都存在这些列。每个表都有不同的列名,因此我需要能够列出我要搜索的列名。我在闭包中尝试了此操作,但我只是得到了有关数据库中不存在的列名的错误,然后您在这些相关表中没有联系人名称和名称。。。它们需要存在才能使这种类型的查询起作用,我只是根据你的问题的例子来说明。我不太确定如何构造我的问题,所以请解释一下我需要什么。基本上,我需要能够搜索一个模型及其与关键字的多个关系,如果其中任何一个存在,则返回主模型。例如,在搜索栏中键入一个用户,它将搜索该用户、用户联系人、用户配置文件,如果其中任何一个返回true,则返回该用户。您仍然需要指定要搜索的列。如果相关表中没有name和contact_name列,则无法尝试在whereHas闭包中搜索这些列。我有要搜索的列的名称,但并非每个表中都存在这些列。每个表都有不同的列名,因此我需要能够列出要搜索的列名。