我正在尝试使用laravel来制作购物车,但遇到一种方法上的麻烦
这是错误:
SQLSTATE [42S22]:找不到列:1054'where子句'中的未知列'pedidos__produtos.pedidos_id'(SQL:从
pedidos__produtos
中选择id_produto,sum(total)作为Total,count(1)作为qtd其中pedidos__produtos
。pedidos_id
= 1和pedidos__produtos
。pedidos_id
不是null,按id_produto
的顺序按id_produto
desc)分组
我搜索了整个代码,但没有在任何地方引用此字段“ pedidos_id” 当我在Carrinhocontroller.php中调用“ $ pedidos [0]-> pedido_produtos”时,会发生此错误
这些是相关的方法和迁移:
CarrinhoController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Pedidos;
use Illuminate\Support\Facades\Auth;
class CarrinhoController extends Controller
{
function __construct(){
$this->middleware('auth');
}
public function index(){
$pedidos = Pedidos::where([
'id_user' => Auth::id()
])->get();
dd([
$pedidos,
$pedidos[0]->pedido_produtos,
//$pedidos[0]->pedidos_produtos[0]->produto
]);
return view('carrinho.index', compact('pedidos'));
}
}
Pedidos.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Pedidos extends Model
{
public function pedido_produtos(){
return $this->hasMany('App\Pedidos_Produtos')
->select( \DB::raw('id_produto, sum(total) as Total, count(1) as qtd'))
->groupBy('id_produto')
->orderBy('id_produto', 'desc');
}
}
Pedidos_Produtos.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Pedidos_Produtos extends Model
{
public function produto(){
return $this->belongsTo('App\Produtos', 'id_produto', 'id');
}
}
从Pedidos迁移:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreatePedidosTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('pedidos', function (Blueprint $table) {
$table->increments('id');
$table->integer('id_user')->unsigned();
$table->foreign('id_user')->references('id')->on('users');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('pedidos');
}
}
以及pedidos_produtos
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreatePedidosProdutosTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('pedidos__produtos', function (Blueprint $table) {
$table->increments('id');
$table->integer('id_pedido')->unsigned();
$table->integer('id_produto')->unsigned();
$table->decimal('total', 6, 2)->default(0);
$table->timestamps();
$table->foreign('id_pedido')->references('id')->on('pedidos');
$table->foreign('id_produto')->references('id')->on('produtos');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('pedidos__produtos');
}
}
有人可以帮我吗?
答案 0 :(得分:1)
您遇到的问题可能与以下行有关:
return $this->hasMany('App\Pedidos_Produtos')
如果在定义hasMany关系时未明确告诉Laravel每个表调用的ID,它将假定ID为{table_name}_id
,而pedidos_id
就是来自此ID。 / p>
尝试将外键和本地键添加到hasMany中,如下所示:
return $this->hasMany('App\Pedidos_Produtos', 'id_pedido', 'id')
答案 1 :(得分:1)
如果未在hasMany
方法上定义foreignKey属性,它将自动生成。
它根据classname_id
模式生成字段名称。同样,localKey的默认值是PK类。
public function hasMany($related, $foreignKey = null, $localKey = null)
您可以这样使用。
return $this->hasMany('App\Pedidos_Produtos','id_pedido')