【发布时间】:2016-08-05 06:37:55
【问题描述】:
如您所见,我收到SQLSTATE[42000] 错误。我的模型中有 2 个作用域,但它们不能一起工作,如果我禁用它可以工作的订单但是当我尝试搜索时我会得到 SQLSTAT[42000] 但如果我禁用订单功能,搜索工作完美。我相信错误出现在 JOIN 中,但找不到确切的位置。
这是搜索和排序的两个功能
public function scopeSearch($query, $data) {
if (trim($data) == "")
return;
$query
->orWhere('idResource', 'like', "%$data%")
->orWhere('title', 'like', "%$data%")
->orWhere('description', 'like', "%$data%")
->orWhere('minimumAge', 'like', "%$data%")
->orWhere('maximumAge', 'like', "%$data%")
->orWhere('fileName', 'like', "%$data%")
->orWhere('extension', 'like', "%$data%")
->orWhere('URL', 'like', "%$data%")
->orWhere('createTime', 'like', "%$data%")
->orWhere('productionKey', 'like', "%$data%");
$query->orWhereHas('user', function ($query) use ($data) {
$query->where('name', 'like', "%$data%");
});
$query->orWhereHas('country', function ($query) use ($data) {
$query->where('name', 'like', "%$data%");
});
$query->orWhereHas('resource', function ($query) use ($data) {
$query->where('name', 'like', "%$data%");
});
$query->orWhereHas('quickTags', function ($query) use ($data) {
$query->where('name', 'like', "%$data%");
});
$query->orWhereHas('tags', function ($query) use ($data) {
$query->where('name', 'like', "%$data%");
});
$query->orWhereHas('relatedTo', function ($query) use ($data) {
$query->where('name', 'like', "%$data%");
});
}
public function scopeOrd($query) {
$query
->join('OPR_User', 'idUser', '=', 'idCreatorUser')
->join('CTL_Country', 'idCountry', '=', 'idCreationCountry')
->join('CTL_ResourceType', 'CTL_ResourceType.idResourceType', '=', 'CTL_Resource.idResourceType')
->select(
'CTL_Resource.*',
'OPR_User.name as creatorUser',
'CTL_Country.country as creationCountry',
'CTL_ResourceType.resourceType as resourceType'
);
}
这是我的控制器
public function index(Request $request) {
$count = DB::table('CTL_Resource')->count();
$per_page = $request->per_page ? $request->per_page : $count;
$order = $request->sort_order ? $request->sort_order : 'DESC';
$sort_name = $request->sort_name ? $request->sort_name : 'createTime';
$search_text = $request->search_text ? $request->search_text : '';
$relations = [
'tags',
'quickTags',
'relatedTo'
];
return CTL_Resource::with($relations)
->search($search_text)
->ord()
->orderBy($sort_name, $order)
->paginate($per_page);
}
这就是整个错误
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CTL_Resource.idCreatorUser `` inner join `CTL_Country`.`idCountry` on `=` CTL_Re' at line 1 (SQL: select count(*) as aggregate from `CTL_Resource` inner join `OPR_User`.`idUser` on `=` CTL_Resource.idCreatorUser `` inner join `CTL_Country`.`idCountry` on `=` CTL_Resource.idCreationCountry `` inner join `CTL_ResourceType`.`idResourceType` on `=` CTL_Resource.idResourceType `` where `idResource` like %Blanca Wiza% or `title` like %Blanca Wiza% or `description` like %Blanca Wiza% or `minimumAge` like %Blanca Wiza% or `maximumAge` like %Blanca Wiza% or `fileName` like %Blanca Wiza% or `extension` like %Blanca Wiza% or `URL` like %Blanca Wiza% or `createTime` like %Blanca Wiza% or `productionKey` like %Blanca Wiza% or exists (select * from `OPR_User` where `CTL_Resource`.`idCreatorUser` = `OPR_User`.`idUser` and `name` like %Blanca Wiza%) or exists (select * from `CTL_Country` where `CTL_Resource`.`idCreationCountry` = `CTL_Country`.`idCountry` and `country` like %Blanca Wiza%) or exists (select * from `CTL_ResourceType` where `CTL_Resource`.`idResourceType` = `CTL_ResourceType`.`idResourceType` and `resourceType` like %Blanca Wiza%) or exists (select * from `CTL_QuickTags` inner join `CTL_Resource_has_QuickTags` on `CTL_QuickTags`.`idQuickTag` = `CTL_Resource_has_QuickTags`.`idQuickTag` where `CTL_Resource_has_QuickTags`.`idResource` = `CTL_Resource`.`idResource` and `name` like %Blanca Wiza%) or exists (select * from `CTL_Tags` inner join `CTL_Resource_has_Tags` on `CTL_Tags`.`idTag` = `CTL_Resource_has_Tags`.`idTag` where `CTL_Resource_has_Tags`.`idResource` = `CTL_Resource`.`idResource` and `name` like %Blanca Wiza%) or exists (select * from `CTL_RelatedTo` inner join `CTL_Resource_has_RelatedTo` on `CTL_RelatedTo`.`idRelatedTo` = `CTL_Resource_has_RelatedTo`.`idRelatedTo` where `CTL_Resource_has_RelatedTo`.`idResource` = `CTL_Resource`.`idResource` and `name` like %Blanca Wiza%))
【问题讨论】:
-
您的join需要包含别名,例如:
join('OPR_User', 'OPR_User.idUser', '=', 'tablename.idCreatorUser') -
我已经试过了,但还是不行
->join('OPR_User', 'OPR_User.idUser', '=', 'CTL_Resource.idCreatorUser') ->join('CTL_Country', 'CTL_Country.idCountry', '=', 'CTL_Resource.idCreationCountry') ->join('CTL_ResourceType', 'CTL_ResourceType.idResourceType', '=', 'CTL_Resource.idResourceType') -
好的,是的,你的回答是正确的我已经尝试过了,但是当它尝试在 CTL_Resources 的
createTime列中搜索时没有通知错误是另一个错误,不知道为什么,可能是因为数据类型.谢谢,您可以将评论更改为答案。非常感谢!!
标签: php laravel search join scope