Я попробовал пример из документации. Я получил два класса:
namespace App;
use Moloquent\Eloquent\Model as Eloquent;
class Author extends Eloquent
{
protected $fillable = [ 'name' ];
}
class Book extends Eloquent
{
public function author()
{
return $this->embedsOne(Author::class);
}
}
В сеансе возиться создаю автора и книгу и пытаюсь сохранить ссылку:
>>> $author = new App\Author(['name'=>'John Doe']);
=> App\Author {#2284
name: "John Doe",
}
>>> $book = new App\Book();
=> App\Book {#2277}
>>> $book->author()->save($author);
=> App\Author {#2284
name: "John Doe",
updated_at: MongoDB\BSON\UTCDateTime {#2296
+"milliseconds": "1534969446023",
},
created_at: MongoDB\BSON\UTCDateTime {#2296},
_id: MongoDB\BSON\ObjectId {#2298
+"oid": "5b7dc6662dab0d03621a1c82",
},
}
>>> $book->save();
=> true
Тем не менее, нет автора, сохраненного с книгой.
>>> $book
=> App\Book {#2277
updated_at: MongoDB\BSON\UTCDateTime {#2268
+"milliseconds": "1534969455111",
},
created_at: MongoDB\BSON\UTCDateTime {#2268},
_id: MongoDB\BSON\ObjectId {#2294
+"oid": "5b7dc66f2dab0d03621a1c83",
},
}
>>> $book->author
=> null
Это сломано, или я делаю это неправильно? Когда я использую метод create (), я получаю чистый результат:
>>> $book->author()->create(['name'=>'Jane Doe']);
=> App\Author {#2302
name: "Jane Doe",
updated_at: MongoDB\BSON\UTCDateTime {#2308
+"milliseconds": "1534970275755",
},
created_at: MongoDB\BSON\UTCDateTime {#2308},
_id: MongoDB\BSON\ObjectId {#2317
+"oid": "5b7dc9a32dab0d03621a1c84",
},
}
>>> $book
=> App\Book {#2277
updated_at: MongoDB\BSON\UTCDateTime {#2268
+"milliseconds": "1534969455111",
},
created_at: MongoDB\BSON\UTCDateTime {#2268},
_id: MongoDB\BSON\ObjectId {#2294
+"oid": "5b7dc66f2dab0d03621a1c83",
},
author: App\Author {#2310
name: "Jane Doe",
updated_at: MongoDB\BSON\UTCDateTime {#2308
+"milliseconds": "1534970275755",
},
created_at: MongoDB\BSON\UTCDateTime {#2308},
_id: MongoDB\BSON\ObjectId {#2309
+"oid": "5b7dc9a32dab0d03621a1c84",
},
},
}
Попытка изменить автора с помощью метода save () все еще не работает:
>>> $book->author()->save(App\Author::first())
=> App\Author {#2352
_id: MongoDB\BSON\ObjectId {#2342
+"oid": "5b7dcdfd2dab0d03621a1c85",
},
name: "Your Name",
updated_at: MongoDB\BSON\UTCDateTime {#2346
+"milliseconds": "1534971389628",
},
created_at: MongoDB\BSON\UTCDateTime {#2347
+"milliseconds": "1534971389628",
},
}
>>> $book
=> App\Book {#2277
updated_at: MongoDB\BSON\UTCDateTime {#2292
+"milliseconds": "1534970479148",
},
created_at: MongoDB\BSON\UTCDateTime {#2268
+"milliseconds": "1534969455111",
},
_id: MongoDB\BSON\ObjectId {#2294
+"oid": "5b7dc66f2dab0d03621a1c83",
},
author: App\Author {#2310
name: "Jane Doe",
updated_at: MongoDB\BSON\UTCDateTime {#2308
+"milliseconds": "1534970275755",
},
created_at: MongoDB\BSON\UTCDateTime {#2308},
_id: MongoDB\BSON\ObjectId {#2309
+"oid": "5b7dc9a32dab0d03621a1c84",
},
},
}
Привет!
Бернхард
Я думаю, что ваша ошибка в том, что после первой строки: $author = new App\Author(['name'=>'John Doe'])
Вы не экономите. Да, вы создаете нового автора, но не сохраняете его, поэтому, когда $book->author()->save($author)
вызывается объект без идентификатора в базе данных, поэтому он не сохраняется,
Попробуйте запустить что-то вроде этого:
$author = new App\Author(['name'=>'John Doe']);
$author->save();
$book = new App\Book();
$book->autor_id = $author->id;
$book->save();
Теперь автор должен быть сохранен правильно!
Также это работает: $book->author()->create(['name'=>'Jane Doe']);
потому что метод create сохраняет в фоновом режиме, передавая существующий объект в базе данных.
Других решений пока нет …