【问题标题】:Laravel 5.3 + Sentinel: BadMethodCallException in Builder.php line 2450Laravel 5.3 + Sentinel:Builder.php 第 2450 行中的 BadMethodCallException
【发布时间】:2016-12-24 02:47:36
【问题描述】:

我正在尝试通过遵循互联网上的一些指南来构建我的第一个 Laravel 应用程序,但我觉得我缺少一些明显的东西。这是代码。

错误

Builder.php 第 2450 行中的 BadMethodCallException:调用未定义 方法 Illuminate\Database\Query\Builder::addresses()

用户模型

<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Sentinel;

class User extends Authenticatable
{
    use Notifiable;

    protected $fillable = [
        'email', 'password',
    ];

    protected $hidden = [
        'password', 
        'remember_token'
    ];

    public function addresses()
    {
        return $this->hasMany('App\CustomerAddress');
    }
}

客户地址模型

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;

class CustomerAddress extends Model
{
    public function user()
    {
        return $this->belongsTo('App\User');
    }
}

客户地址控制器

<?php
namespace App\Http\Controllers;
use App\CustomerAddress;
use Illuminate\Http\Request;

class CustomerAddressController extends Controller
{
    public function create(Request $request)
    {
        $address = new CustomerAddress();
        $address->address = $request['address'];
        $request->user()->addresses()->save($address);
    }
}

这段代码后出现错误:

$request->user()->addresses()->save($address);

有什么想法吗?谢谢和欢呼

【问题讨论】:

  • 在request->user()->addresses()->save($address)之前需要$address->save();
  • 也使用 $request->input('address')
  • customer_address表上也应该有user_id字段
  • 您好,感谢您的快速回复。添加 $address->save() 会给出另一条错误消息,并且 customer_address 表中有一个列“字段'user_id'没有默认值(SQL:插入customer_addressesaddressupdated_atcreated_at) 值 (asdasd, 2016-12-24 02:54:34, 2016-12-24 02:54:34))”,即使在 CustomerAddress-model 中将“地址”添加到可填充项之后。
  • 试试 $request->user()->addresses()->associate($address);让我们看看

标签: php laravel laravel-5 laravel-5.3 sentinel


【解决方案1】:
  • 在 .config/cartalyst.sentinel.php 中,将 'model' =&gt; 'Cartalyst\Sentinel\Users\EloquentUser' 更改为 'model' =&gt; 'App\User' 以使用定义了 addresses 关系的用户模型
  • 在 ./app/User 中将 User extends Authenticatable 更改为 User extends \Cartalyst\Sentinel\Users\EloquentUser 以将 sentinel 的用户扩展到您应用的用户模型
  • 最后,您的控制器代码现在应该是

`$address = new CustomerAddress(); $address->address = $request->input('address');

$request->user()->addresses()->save($address);`

一切都应该是桃色的

【讨论】:

  • 嘿!以上对我有用,但是我有一个与最后一段代码有关的问题。为什么我需要先保存表中的地址($address->save()),然后通过$request->user()->addresses()->save($address)添加user_id?这不会导致执行两 (2) 个插入查询吗?如果没有 $address->save(),它对我来说也可以正常工作。干杯,谢谢!
  • 同时插入所有内容也不需要表中 user_id 的可为空属性。我不知道,我可能只是在这里遗漏了一些重要的东西。
  • 你是对的,添加 $address->save() 是我需要 user_id 可以为空的原因。如果您删除 $address->save(),它应该可以正常工作,而 user_id 不可以为空。我希望这能解决问题
  • 太棒了!也许我终于明白了。再次感谢你的帮助。干杯!
猜你喜欢
  • 1970-01-01
  • 2017-02-01
  • 2017-02-21
  • 2018-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多