【问题标题】:Laravel global scopes and joinsLaravel 全局作用域和连接
【发布时间】:2015-08-06 15:45:36
【问题描述】:

我在 Laravel 5.1 中有一个全局范围设置,运行良好。然而,在我的一些页面上,我使用 Eloquent 构建器使用 MySQL joins。这会导致一个模棱两可的错误:

Column 'cust_id' in where clause is ambiguous

我不确定如何避免这个问题。我知道我可以使用子查询来代替,但是没有其他解决方案吗?

这是我的范围文件:

<?php

namespace App\Scopes;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\ScopeInterface;
use App\Customers;
use DB, Session;

class MultiTenantScope implements ScopeInterface
{
    /**
     * Create a new filter instance.
     *
     * @param  UsersRoles $roles
     * @return void
     */
    public function __construct()
    {
        $this->custId = Session::get('cust_id');
    }

    /**
     * Apply scope on the query.
     *
     * @param Builder $builder
     * @param Model $model
     * @return void
     */
    public function apply(Builder $builder, Model $model)
    {
        if($this->custId) 
        {
            $builder->whereCustId($this->custId); 
        } 
        else 
        {
            $model = $builder->getModel();
            $builder->whereNull($model->getKeyName()); 
        }
    }

    /**
     * Remove scope from the query.
     *
     * @param Builder $builder
     * @param Model $model
     * @return void
     */
    public function remove(Builder $builder, Model $model)
    {
        $query = $builder->getQuery();
        $query->wheres = collect($query->wheres)->reject(function ($where) 
        {
            return ($where['column'] == 'cust_id');
        })->values()->all();
    }  
}

【问题讨论】:

    标签: php laravel laravel-5 laravel-5.1


    【解决方案1】:

    为了消除字段的歧义,您应该添加表名作为前缀:

    public function apply(Builder $builder, Model $model)
    {
        if($this->custId) 
        {
            $fullColumnName = $model->getTable() . ".cust_id";
            $builder->where($fullColumnName, $this->custId); 
        } 
        else 
        {
            $model = $builder->getModel();
            $builder->whereNull($model->getKeyName()); 
        }
    }
    

    【讨论】:

    • 更好的解决方案是$builder-&gt;qualify('cust_id');
    猜你喜欢
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    相关资源
    最近更新 更多