我正在通过访问器和更改器加密/解密Laravel中的DB字段值,这在正常的口才交易中工作正常。
class Person extends Model
{
use Notifiable;
protected $table = 'person';
public function getFirstNameAttribute($value)
{
return Crypt::decryptString($value);
}
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $guarded = array();
protected function user()
{
return $this->belongsTo('App\Models\User', 'useraccount_id', 'id');
}
}
但加密和解密在以下条件下无法正常工作
工作
$person = Person::find($person_id);
$person->firstName;
不工作
$user = User::find($user_id);
$user->person->firstName;
答案 0 :(得分:3)
您可能会在数据库级别进行加密,就好像某人可以访问数据库一样,您不希望他们能够以纯文本格式读取人们的医疗数据。
您可以创建一个特征,分别在保存和检索时对数据进行加密和解密:
namespace App\Traits;
use Illuminate\Support\Facades\Crypt;
trait Encryptable
{
/**
* If the attribute is in the encryptable array
* then decrypt it.
*
* @param $key
*
* @return $value
*/
public function getAttribute($key)
{
$value = parent::getAttribute($key);
if (in_array($key, $this->encryptable) && $value !== '') {
$value = decrypt($value);
}
return $value;
}
/**
* If the attribute is in the encryptable array
* then encrypt it.
*
* @param $key
* @param $value
*/
public function setAttribute($key, $value)
{
if (in_array($key, $this->encryptable)) {
$value = encrypt($value);
}
return parent::setAttribute($key, $value);
}
/**
* When need to make sure that we iterate through
* all the keys.
*
* @return array
*/
public function attributesToArray()
{
$attributes = parent::attributesToArray();
foreach ($this->encryptable as $key) {
if (isset($attributes[$key])) {
$attributes[$key] = decrypt($attributes[$key]);
}
}
return $attributes;
}
}
然后,您可以仅将特征应用于模型,并定义一个名为$ encryptable的属性,该属性是应加密其数据的列的数组:
class YourModelextends Model
{
use Encryptable;
protected $encryptable = [
'code',
'keys',
'allergies'
];
}
答案 1 :(得分:1)
基于Iman的回答,我更改了特征,使其与Laravel自身的演员表数组配合使用。
i1 <- rle(df$TC_17)
#Run Length Encoding
# lengths: int [1:5] 3 1 2 2 2
# values : int [1:5] 1 -1 1 -1 1
i1$values[which(i1$lengths == 1 & i1$values == -1)] <- 1
#Run Length Encoding
# lengths: int [1:5] 3 1 2 2 2
# values : num [1:5] 1 1 1 -1 1
i2 <- which(rep(i1$values, i1$lengths) == 1)
#[1] 1 2 3 4 5 6 9 10
split(i2, cumsum(c(TRUE, diff(i2) != 1)))
#$`1`
#[1] 1 2 3 4 5 6
#$`2`
#[1] 9 10
答案 2 :(得分:0)
您可以使用laravel的 Crypt 门面来做到这一点。 请按照此示例。
use Illuminate\Support\Facades\Crypt;
$encrypted = Crypt::encryptString('Hello world.');
$decrypted = Crypt::decryptString($encrypted);