Как сделать так, чтобы вложения Молонча работали? - PullRequest
0 голосов
/ 25 августа 2018

Я попробовал пример из документации.У меня есть два класса:

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",
       },
     },
   }

Привет!

Бернхард

1 Ответ

0 голосов
/ 25 августа 2018

Я думаю, что ваша ошибка в том, что после первой строки: $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 сохраняет в фоновом режиме, передавая существующий объект в базе данных.

...