【问题标题】:Laravel QueryException on Saving Model: Trying to save wrong modelLaravel QueryException 保存模型:试图保存错误的模型
【发布时间】:2016-05-25 02:41:32
【问题描述】:

所以,我的小应用中有两个模型,一个是 Post 模型,另一个是 Autovistoria。 Post Model 工作得很好,它有点像博客。 但是当我实现 AutovistoriaController 和 View 时,看起来 Post 模型被调用了,而不是 Autovistoria。 所以,我的 autovistoria 路线是:

//form for new Autovistoria
Route::get('autovistoria/nova','AutovistoriaController@criar');
// Create new Autovistoria
Route::post('autovistoria/nova','AutovistoriaController@salvar_vistoria');

控制器方法:

<?php

namespace monografia\Http\Controllers;

use Illuminate\Http\Request;
use monografia\Autovistoria;
use monografia\User;
use Redirect;
use monografia\Http\Requests\AutovistoriaFormRequest;
use monografia\Http\Requests;
use Auth;

class AutovistoriaController extends Controller
{
    public function criar(Request $request)
    {
        // Verifica se usuario pode executar vistoria (Usuários)
        if($request->user()->pode_vistoriar())
        {
            return view('autovistoria.nova');
        }
        else
        {
            return redirect('autovistoria/listar')->withErrors('Você não tem autorização para criar uma vistoria.');
        }
    }
    public function salvar_vistoria(AutovistoriaFormRequest $request)
   {
        $autovistoria = new Autovistoria();
        $autovistoria->endereco = $request->get('endereco');
        $autovistoria->bairro = $request->get('bairro');
        $autovistoria->cep = $request->get('cep');
        $autovistoria->pavimentos = $request->get('pavimentos');
        $autovistoria->autor_id = $request->user()->id;
        $message = 'Vistoria Criada. Você pode iniciá-la quando desejar';
        $autovistoria->save();
        return redirect('autovistoria.nova')->withMessage($message);
    }
}

表单请求:

class AutovistoriaFormRequest extends Request {
    /**
     * Determina se usuário pode fazer a postagem.
     *
     * @return bool
     */
    public function authorize()
    {
        if($this->user()->pode_vistoriar())
        {
            return true;
        }
        return false;
    }
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'endereco' => 'required|unique:posts|max:255',
            'bairro' => 'required|unique:posts|max:255',
            'cep' => 'required',
        ];
    } }

模型:

class Autovistoria extends Model
{
    protected $table = 'autovistoria';
    // Proteje a tabela contra mudanças
    protected $guarded = [];
    // Retorna a instancia do usuário autor da vistoria
    public function autor()
    {
        return $this->belongsTo('monografia\User','autor_id');
    }
}

要保存的视图路径是正确的,即使我尝试通过修补程序创建一个新模型它也可以工作,但是当我通过表单发送时,它会尝试将数据库保存在帖子模型而不是 Autovistoria 中,导致

SQL 错误:Connection.php 第 673 行中的 QueryException:SQLSTATE[42S22]:未找到列:1054 'where 子句'中的未知列 'endereco'(SQL:从 endereco = Rua 的帖子中选择计数(*)作为聚合睾丸)

有人可以帮我吗?

编辑:

我的架构:

Schema::create('autovistoria', function(Blueprint $table)
{
  $table->increments('id');
  $table->integer('autor_id') -> unsigned() -> default(0);
  $table->foreign('autor_id')
      ->references('id')->on('users')
      ->onDelete('cascade');
  $table->string('endereco')->unique();
  $table->integer('pavimentos');
  $table->text('conteudo');
  $table->text('categoria');
  $table->boolean('vistoriado');
  $table->timestamps();
});

form.blade

<form action="nova" method="post" name="nova-vistoria">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
    <div class="form-group">
        <label for="endereco">Digite o endereço da Edificação:</label>
        <input required="required" value="{{ old('endereco') }}" placeholder="Rua Exemplo, numero 2" type="text" name = "endereco" class="form-control" />
    </div>
    <div class="form-group">
        <label for="endereco">Bairro onde está situada:</label>
        <input required="required" value="{{ old('bairro') }}" placeholder="Ex: Barra da Tijuca, Botafoto, Copacabana..." type="text" name = "bairro" class="form-control" />
    </div>
    <div class="form-group">
        <label for="endereco">CEP da edificação (Apenas números):</label>
        <input required="required" value="{{ old('cep') }}" placeholder="21345123" type="text" name = "cep" class="form-control" />
    </div>
    <div class="form-group">
        <label for="pavimentos">Total de pavimentos da edificação:</label>
            <select name = "pavimentos" class="form-control">
                @for($i = 1; $i < 21; $i++)
                    <option value="{{$i}}">{{$i}}</option>"
                @endfor
            </select>
    </div>
    <div class="form-group"><input type="submit" name='salvar' class="btn btn-success" value = "Salvar"/></div>
</form>

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    我会在模型中添加这个..

    class Autovistoria extends Model
        {
            protected $table = 'autovistoria';
            // Proteje a tabela contra mudanças
           //https://laravel.com/docs/5.2/eloquent  Mass Assignment
            protected $guarded = ['id'];
            // Retorna a instancia do usuário autor da vistoria
            public function autor()
            {
                return $this->belongsTo('monografia\User','autor_id');
            }
        }
    

    我还将验证模型(表 autovistoria)是否具有: 1) id (int autoincrement) 2)我会尝试用这样的虚拟数据(在 post 方法中)保存模型......

     public function salvar_vistoria(AutovistoriaFormRequest $request)
       {
            $autovistoria = new Autovistoria();
            $autovistoria->endereco = "Dummy data";
            $autovistoria->bairro = "Dummy data");
            $autovistoria->cep = "Dummy data";
            $autovistoria->pavimentos = "Dummy data";
            $autovistoria->autor_id = "user id";
            $message = 'Vistoria Criada. Você pode iniciá-la quando desejar';
            $autovistoria->save();
            return redirect('autovistoria.nova')->withMessage($message);
        }
    }
    

    如果模型 DOES NOT SAVE 正确,则模型存在错误。如果您发布此表或表结构的迁移文件,我会很有用。

    如果这有帮助,请告诉我:)

    【讨论】:

      【解决方案2】:

      所以,我找到了问题所在。

      问题出在迁移文件上。 我重命名了这个类(名字是复数,我把它的s去掉,从Autovistorias重命名为Autovistoria),但是没有更改迁移文件类名,所以它不能正常工作。

      修改迁移文件类名后效果很好

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-02
        • 2014-07-27
        • 2014-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多