【问题标题】:Laravel: SQLSTATE[42000] error in JOINs (Status Code 500)Laravel:JOIN 中的 SQLSTATE[42000] 错误(状态码 500)
【发布时间】: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


【解决方案1】:

在您的 Joins 语句中,您必须在列名之前添加表的别名,例如:

join('OPR_User', 'OPR_User.idUser', '=', 'tablename.idCreatorUser')

您将对所有联接执行此操作,请确保使用正确的表别名/名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多