This is actually quite easy but it should be done in the correct way.
You can ignore all this and go and look at the official docs here: https://www.drupal.org/docs/drupal-apis/entity-api/working-with-the-entity-api
And that will get you started, but the tricky bit is then setting the fields. You can set the values easily:
$node_storage = \Drupal::entityTypeManager()->getStorage('node');
// Create a new unsaved node.
$node = $node_storage->create([
'type' => 'page',
'title' => 'Test page',
'field_boolean' => [
'value' => 0
],
'moderation_state' => [
'value' => 'published'
],
]);
// Save it.
$node->save();
// Get the node ID (only available after save).
$nid = $node->id();
But it’s not always easy to figure out what the values should be. For instance, if you’re referencing an entity then you need:
...
'field_related_page' => [
[
'target_id' => 123
],
],
...
Remember that creating a field to only have one value doesn’t change how it’s stored. So this means that you’ll need to create a single element array containing the array that has the value for the field in it.
The easiest way to figure this out is to use Drush.
First of all create a new node in the admin backend that you can use as an example and then use Drush to get a PHP command line with Drupal loaded:
$ drush php:cli Psy Shell v0.10.6 (PHP 7.3.23 — cli) by Justin Hileman
Then add a use statement to get to the Node class and load your example node:
>>> use \Drupal\node\Entity\Node; >>> $n = Node::load(456);
Now you can get the fields in their array format to see what it is you need to do use to set a field value:
>>> $n->get('moderation_state')[0]->toArray();
=> [
"value" => "published",
]
As I mentioned above, a field value is actually an array of values of the field. So the [0] above gets the first value for the moderation state field.