首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel Eloquent::Laravel Laravel

Laravel Eloquent::Laravel Laravel
EN

Stack Overflow用户
提问于 2014-06-01 15:09:48
回答 2查看 2.3K关注 0票数 2

好的,我正在尝试在另一个雄辩的模型中使用雄辩的方法"firstOrCreate“。

FriendRequest口才

代码语言:javascript
复制
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‘。

行或索引上没有默认值。

下面是Friend Eloquent模型

代码语言:javascript
复制
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');
}

}
EN

回答 2

Stack Overflow用户

发布于 2015-09-15 01:54:03

create()方法进行批量赋值,这是一个很大的安全问题,因此Laravel可以对其进行保护。在内部,它有guarded = '*',所以你的所有列都将受到保护,不会被大量赋值。您有一些选项:

设置模型的可填充列:

代码语言:javascript
复制
class User extends Eloquent {

    protected $fillable = array('first_name', 'last_name', 'email');

}

或者只设置你想要保护的那些:

代码语言:javascript
复制
class User extends Eloquent {

  protected $guarded = array('password');

}

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

代码语言:javascript
复制
class User extends Eloquent {

    protected $guarded = array();

}

也谈到firstorcreate和firstornew之间的区别:

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

您还可以通过外观并使用以下代码:

代码语言:javascript
复制
 class Settings extends Eloquent
 {
    protected $table = 'settings';
    protected $primaryKey = 'name';

     public static function get($settingName)
     {
         return Settings::firstOrCreate(array('name' => $settingName));
      }
}
票数 3
EN

Stack Overflow用户

发布于 2015-02-15 04:53:11

我认为你应该把你的accept()函数放在一个控制器中,而不是放在模型中。我不确定您是如何以及在哪里调用此函数的,但我认为它在错误的位置。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23977555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档