关于保存模型的Laravel QueryException:试图保存错误的模型

时间:2016-05-24 17:44:55

标签: php laravel

所以,我的小应用程序中有两个模型,一个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未知列&#39; endereco&#39;在&#39; where子句&#39; (SQL:从countreco = Rua Teste的帖子中选择count(*)作为聚合)

有人可以帮助我吗?

编辑:

我的架构:

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>

2 个答案:

答案 0 :(得分:0)

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

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);
    }
}

如果模型不能保存,则模型存在错误。如果您发布此表或表sctructure的迁移文件,我会很有用。

请告诉我这是否有帮助:)

答案 1 :(得分:0)

所以,我发现了问题。

问题是迁移文件。 我重命名了这个类(名称是复数,我取出了它,从Autovistorias重命名为Autovistoria),但没有更改迁移文件类名,因此它无法正常工作。

更改迁移文件类名

后,它工作正常