yiisoft / yii2-mongodb

Yii 2 MongoDB extension
http://www.yiiframework.com
BSD 3-Clause "New" or "Revised" License
326 stars 191 forks source link

the "unset field" feature #323

Open ziaratban opened 3 years ago

ziaratban commented 3 years ago
Q A
Is bugfix? no
New feature? yes
Breaks BC? no
Tests pass? yes

In mongodb , we can unset a field only in a document unlike the SQL databases. so we need this feature in update of ActiveRecord.

Syntax $document->Unset('field1','field2','field3','fieldN' ...);

Example

//users collection
{
    _id    : ObjectId('5f9a84109d2ff23d816e7983'),
    name   : 'N-A',
    family : 'F-A',
    email  : 'a@example.com'
}
{
    _id    : ObjectId('5de5320014bf173d3e838102'),
    name   : 'N-B',
    family : 'F-B',
    email  : 'b@example.com'
}
$doc1 = MyActiveRecordClass::FindOne('5f9a84109d2ff23d816e7983');
$doc1->name = 'N-A(edited)';
$doc1->Unset('email');
$doc1->Save();

$doc2 = MyActiveRecordClass::FindOne('5de5320014bf173d3e838102');
$doc2->Unset('name','email');
$doc2->Save();

the user's collection after saving

{
    _id : ObjectId('5f9a84109d2ff23d816e7983'),
    name : 'N-A(edited)',
    family : 'F-A',
}
{
    _id : ObjectId('5de5320014bf173d3e838102'),
    family : 'F-B',
}

So what is the difference between php unset() function and yii2 Unset() method ?

#php unset();
$doc1 = MyActiveRecordClass::FindOne('5f9a84109d2ff23d816e7983');
$doc1->name = 'N-A(edited)';
unset($doc1->email); #only sets email attribute to null
$doc1->Save(); #updates only name attribute
#yii2 ActiveRecord::Unset();
$doc1 = MyActiveRecordClass::FindOne('5f9a84109d2ff23d816e7983');
$doc1->name = 'N-A(edited)';
$doc1->Unset('email'); #sets email attribute to null
$doc1->Save(); #unsets email field and updates name field

unset method in insert mode

$doc1 = new MyActiveRecordClass;
$doc1->name = "...";
$doc1->family= "...";
$doc1->Unset('name'); #like php > unset($doc1->name);
$doc1->Save(); #only add the family field
samdark commented 3 years ago

@ziaratban I've moved CI to GitHub actions so there are no incidental failures anymore. Would you please merge master branch into all your pull requests?