【问题标题】:my laravel query not working for stock consultation我的 laravel 查询不适用于股票咨询
【发布时间】:2022-07-13 21:29:54
【问题描述】:

美好的一天,我正在尝试用 eloquent 进行此查询,但我无法使其工作

我在 SQL Server 中有 2 个查询模型,它们是不同的数据库

1 用于 laravel 用户和配置

还有另一个我想查询仓库库存的 SAP BUSINESS ONE 数据库

在我有用户身份验证的地方,它与其他数据库无关,我只想从 sap 中查阅数据数据

但我想使用备用数据库中的几个表

我已经做了一个,但是它重复了关于商店数量等的数据。另一个是失败

最后一个是我需要的查询

如果你能帮助我,我将不胜感激

第一个模型

class Almacen extends Model
{
    use HasFactory;

    Public function relaciona()
    {
        return $this->belongsToMany('App\Models\Stock');
    }

    protected $connection = 'sqlsrv2';
    protected $table = 'OITW';

}

第二个模型

class Stock extends Model
{
    use HasFactory;

    Public function relacions()
    {
        return $this->belongsToMany(Almacen::class);
    }
    
    protected $connection = 'sqlsrv2';
    protected $table = "OITM";
}

对我有用但重复数据查询是从控制器发出的

$Stock =  Stock::select(
        'OITM.ItemCode',
        'OITM.ItemName',
        'OITM.OnHand',
        'OITW.WhsCode',
        'OITM.SalUnitMsr'
        /* ,'OBTN.ExpDate' */
    )
   //->crossJoin('OBTN')
   ->crossJoin('OITW')
   //->groupBy('OITM.ItemCode')
   //->select('OITM.ItemCode','OITM.Itemname','OITM.OnHand')
   ->where('OITW.ItemCode','=',Almacen::raw('OITM.ItemCode'))
   //->where('OITW.WhsCode',/* '=', *//* '01', */'01')
   //->where('OITM.OnHand','>',0.00)
   //->where('OBTN.ExpDate','=' ,'2022-08-08')
   -> get();

return view('stock.index', compact('Stock'));

正确查询

SELECT
    T0.[WhsCode],
    T1.[WhsName],
    T0.[OnHand],
    T2.[ItemCode],
    T2.[ItemName]
FROM
    OITW T0
    INNER JOIN
        OWHS T1 ON T0.[WhsCode] = T1.[WhsCode]
    INNER JOIN
        OITM T2 ON T0.[ItemCode] = T2.[ItemCode]
ORDER BY T0.[WhsCode]

【问题讨论】:

    标签: php sql laravel


    【解决方案1】:

    与您的问题相比,与代码审查更相关的几件事。

    • 您应该将属性留在类的开头,然后继续声明方法。
    • 正确的关键字是public,而不是Public。 Windows 可能会让你侥幸逃脱,因为它不区分大小写,但 unix 服务器可能会给你一个错误。
    • 您可以在关系方法中使用Model::class。你这样做是为了Stock,但不是为了Almacen。你应该保持一致。
    • 根据您提供的查询,我不确定这两个模型是否存在 M:N 关系,因此 belongsToMany 方法可能不是正确的。
    class Almacen extends Model
    {
        use HasFactory;
    
        protected $connection = 'sqlsrv2';
        protected $table = 'OITW';
    
        public function relaciona()
        {
            return $this->belongsToMany(Stock::class);
        }
    
    }
    
    class Stock extends Model
    {
        use HasFactory;
    
        protected $connection = 'sqlsrv2';
        protected $table = "OITM";
    
        public function relacions()
        {
            return $this->belongsToMany(Almacen::class);
        }    
    }
    

    关于查询,您使用的不是CROSS JOIN,而是INNER JOIN,所以应该使用join()

    这是一个相当简单的查询,因此在查询构建器中看起来几乎相同。

    $results = DB::connection('sqlsrv2')->query() // specify connection if sqlsrv2 is not the default
        ->select(
            'T0.[WhsCode]',
            'T1.[WhsName]',
            'T0.[OnHand]',
            'T2.[ItemCode]',
            'T2.[ItemName]'
        )
        ->from('OITW', 'T0')
        ->join('OWHS T1', 'T0.[WhsCode]', 'T1.[WhsCode]')
        ->join('OITM T2', 'T0.[ItemCode]', 'T2.[ItemCode]')
        ->orderBy('T0.[WhsCode]')
        ->get();
    

    这将返回一个对象集合。如果您希望它返回一个 Eloquent 模型集合,请使用您的模型而不是 DB 外观。

    $results = Stock::query() // connection is specified in the model
        ->select(
            'T0.[WhsCode]',
            'T1.[WhsName]',
            'T0.[OnHand]',
            'T2.[ItemCode]',
            'T2.[ItemName]'
        )
        ->from('OITW', 'T0') // specify the table again so we can alias it as T0
        ->join('OWHS T1', 'T0.[WhsCode]', 'T1.[WhsCode]')
        ->join('OITM T2', 'T0.[ItemCode]', 'T2.[ItemCode]')
        ->orderBy('T0.[WhsCode]')
        ->get();
    

    【讨论】:

      【解决方案2】:

      谢谢兄弟,你的支持很有帮助,是的,我不是 laravel 方面的专家,它仍然让我很困惑,但是学习了我调整它的代码,所以它对我有用。

      $Stock =  DB::connection('sqlsrv2')->query() // connection is specified in the model
            
            ->SELECT( 
              'T0.WhsCode', 
              'T1.WhsName', 
              'T0.OnHand', 
              'T2.ItemCode', 
              'T2.ItemName' 
              )
            ->FROM( 'OITW' , 'T0' ) 
            ->JOIN ('OWHS AS T1' , 'T0.WhsCode' , '=', 'T1.WhsCode' )
            ->JOIN ('OITM AS T2' , 'T0.ItemCode', '=', 'T2.ItemCode' )
            ->ORDERBY ('T0.WhsCode')
            ->get();
      
       
      

      【讨论】:

      • 方法名是selectfromjoinorderBy。不要将它们大写,因为这会在区分大小写的系统中引发错误。
      猜你喜欢
      • 2020-03-29
      • 2015-06-04
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 2020-06-13
      • 2015-09-26
      • 2017-11-18
      • 1970-01-01
      相关资源
      最近更新 更多