雄辩的Laravel:首先创造问题


Laravel Eloquent::firstOrCreate Problems

好的,所以我试图在另一个Eloquent模型中使用Eloquent方法"firstOrCreate"。

FriendRequest雄辩的

class FriendRequest extends Eloquent {
/**
 * The database table used by the model.
 *
 * @var string
 */
public $table = 'requests';
protected $guarded = array('id');
protected $softDelete = true;
public function friend() {
    return $this->hasOne('User', 'id', 'friend_id');
}
public function user() {
    return $this->hasOne('User', 'id', 'user_id');
}
public function accept() {
    // FIRST YOU MUST MARK REQUEST AS ACCEPTED
    // THEN SOFT DELETE REQUEST SO IT DOESN'T
    // SHOW UP AS ACTIVE FRIEND REQUEST
    $this->accepted = '1';
    $this->save();
    // CREATE FRIENDSHIP USER -> REQUESTED
    $friend             =   Friend::firstOrNew(array('user_id' => Auth::user()->id, 'friend_id' => $this->friend_id));
    $friend->save();
    // CREATE FRIENDSHIP REQUESTED -> USER
    $friend2             =   Friend::firstOrNew(array('user_id' => $this->friend_id, 'friend_id' => Auth::user()->id));
    $friend2->save();
    // SOFT DELETE REQUEST BEING MARKED ACCEPTED
    $status = $this->delete();
    if (!$status):
        return false;
    else:
        return true;
    endif;
}
}

我已经尝试了firstOrCreate和firstOrNew,如所示,但两次'friend_id'和'user_id'在数组中给定被设置为'0'。

没有默认的行或索引。

这是朋友雄辩模型

class Friend extends Eloquent {
/**
 * The database table used by the model.
 *
 * @var string
 */
public $table = 'friends';
protected $guarded = array('id');
public function user() {
    return $this->hasOne('User', 'id', 'user_id');
}
public function friend() {
    return $this->hasOne('User', 'id', 'friend_id');
}
}

create()方法进行大量赋值,这是一个很大的安全问题,所以Laravel有一个针对它的保护。在内部它有守卫=['*'],所以你所有的列将被保护,防止大规模分配。你有一些选择:

设置模型的可填充列:

class User extends Eloquent {
    protected $fillable = array('first_name', 'last_name', 'email');
}

或者只设置你想要保护的对象:

class User extends Eloquent {
  protected $guarded = array('password');

}

你也可以这样做,但风险自负:

class User extends Eloquent {
    protected $guarded = array();
}

还有关于firstorcreate和firstornew的区别:

与firstOrCreate方法一样,firstOrNew方法将尝试在数据库中找到与给定属性匹配的记录。但是,如果没有找到模型,则将返回一个新的模型实例。注意,由firstOrNew返回的模型还没有持久化到数据库中。您需要手动调用save来保存它:

您还可以浏览Facade并使用以下命令:

 class Settings extends Eloquent
 {
    protected $table = 'settings';
    protected $primaryKey = 'name';
     public static function get($settingName)
     {
         return Settings::firstOrCreate(array('name' => $settingName));
      }
}

我相信你应该把你的accept()函数在你的控制器之一,而不是模型。我不确定你是如何以及在哪里调用这个函数,但我认为它在错误的地方。