Relationship between channels/entries
It’s important to understand that using relations fields in the template works similar to using craft.entries. They return a element query object, for example entry.plantEntity in your entries loop. And you need to call the all() method on them to query for the elements. The same applies to querying for the asset elements in your inner entries loop.

{% set plantCares = craft.entries
    .section('plantCare')
    .all() %}

{% for plantCare in plantCares %}
    {% for plantEntity in plantCare.plantEntity.all() %}
        {% for plantPhoto in plantEntity.plantPhoto.all() %}
            &lt;img src="{{ plantPhoto.getUrl() }}" alt="{{ plantPhoto.title }}"&gt;
        {% endfor %}

        {{ plantEntity.title }}
    {% endfor %}
{% endfor %}


You should generally avoid querying in a loop though, and use eager-loading instead.

{% set plantCares = craft.entries
    .section('plantCare')
    .with([
        'plantEntity',
        'plantEntity.plantPhoto'
    ])
    .all() %}

{% for plantCare in plantCares %}
    {% for plantEntity in plantCare.plantEntity %}
        {% for plantPhoto in plantEntity.plantPhoto %}
            &lt;img src="{{ plantPhoto.getUrl() }}" alt="{{ plantPhoto.title }}"&gt;
        {% endfor %}

        {{ plantEntity.title }}
    {% endfor %}
{% endfor %}


If you’ve got many plantCare entries consider paginating through them.