Коллекция Laravel 5.0 содержит () не работает, как ожидалось? - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть коллекция моих отношений. 1 Почтовая группа имеет много внешних клиентов.

Когда я добавляю эту коллекцию так:

dd($mailgroup->externalClients);

Я получаю этот результат:

Collection {#304 ▼
  #items: array:1 [▼
    0 => ExternalClient {#303 ▼
      #table: "external_clients"
      +timestamps: false
      #casts: array:1 [▶]
      #fillable: array:7 [▶]
      #connection: null
      #primaryKey: "id"
      #perPage: 15
      +incrementing: true
      #attributes: array:8 [▼
        "id" => 1
        "firstname" => "Ganesan "
        "lastname" => "Pandaram"
        "email" => "mailtoganesh.p@gmail.com"
        "active" => 1
        "lang" => "nl"
        "company" => "ypto"
        "site_id" => 4
      ]
      #original: array:10 [▶]
      #relations: array:1 [▶]
      #hidden: []
      #visible: []
      #appends: []
      #guarded: array:1 [▶]
      #dates: []
      #touches: []
      #observables: []
      #with: []
      #morphClass: null
      +exists: true
    }
  ]
}

Теперь я хочу попробовать функцию $ collection-> contains (), вот так я ничего не получаю.

if ($mailgroup->externalClients->contains('mailtoganesh.p@gmail.com')) {
    echo 'yes';
}

Я ожидаю увидеть «да», потому что мы видим, что «mailtoganesh.p@gmail.com» находится в коллекции.

Я тоже пробовал это:

if ($mailgroup->externalClients->contains('email', 'mailtoganesh.p@gmail.com')) {
    echo 'yes';
}

Это дает мне эту ошибку:

Объект класса Closure не может быть преобразован в int

Ответы [ 3 ]

1 голос
/ 30 апреля 2019

Вы можете попробовать where() вспомогательную функцию коллекции. Который даст правильный результат. Ниже приведен результат для этого: -

$externalClients = $mailgroup->externalClients;
if($externalClients->where('email', 'mailtoganesh.p@gmail.com')->count() > 0) {
    echo "yes";
}

Вот ссылка на вспомогательную функцию коллекции: , где () документы .

Для Laravel 5.0 вы можете отослать это .

Попробуйте и проверьте. Я думаю, что это будет работать.

0 голосов
/ 30 апреля 2019

Какую версию Laravel вы используете?

В v5.8 я могу фильтровать объекты по имени и значению атрибута.

См:

>>> $users = factory(App\User::class, 3)->make();
=> Illuminate\Database\Eloquent\Collection {#3278
     all: [
       App\User {#3276
         customer_id: 57,
         name: "Jeanie Cassin V",
         email: "ksporer@example.org",
         is_active: true,
         email_verified_at: DateTime @184931115 {#3273
           date: 1975-11-11 09:45:15.0 UTC (+00:00),
         },
         last_login_at: "2018-12-16 09:06:01",
       },
       App\User {#3285
         customer_id: 58,
         name: "Prof. Lula Moore",
         email: "gulgowski.brenden@example.net",
         is_active: true,
         email_verified_at: DateTime @270031087 {#3275
           date: 1978-07-23 08:38:07.0 UTC (+00:00),
         },
         last_login_at: "2007-02-19 00:27:52",
       },
       App\User {#3287
         customer_id: 59,
         name: "Conrad Hansen",
         email: "kenneth98@example.com",
         is_active: true,
         email_verified_at: DateTime @1026743001 {#3289
           date: 2002-07-15 14:23:21.0 UTC (+00:00),
         },
         last_login_at: "1987-10-06 18:45:35",
       },
     ],    }
>>> $rs = $users->contains('email', 'ksporer@example.org');
=> true
>>> $rs = $users->contains('email', 'other@example.com');
=> false
>>> $rs = $users->contains(function($user) { return $user->email === 'ksporer@example.org'; });
=> true
>>> $rs = $users->contains(function($user) { return $user->email === 'other@example.com'; });
=> false

Но, как указано, это проверено в Laravel 5.8.


Вы можете попробовать использовать анонимную функцию, чтобы получить возвращаемое значение true / false с пользовательским сравнением.

Он передаст 2 параметра (в 5.8):

  1. Объект
  2. Ключ объекта в коллекции

В вашем случае вы можете пропустить второй параметр.

Например:

$email = 'mailtoganesh.p@gmail.com';

$clientExists = $mailgroup->externalClients->contains(
    function (ExternalClient $externalClient) use ($email) {
        return $externalClient->email === $email;
    });

if ($clientExists) {
    // yes
}

Если вам нужен ключ предмета (объекта) в коллекции, вы можете использовать:

$result = $collection->contains(
    function ($object, $key) {
        // check something with $object->x or $key and return bool
    });
0 голосов
/ 30 апреля 2019

В тинкере я провел какой-то тест, кажется, where - неправильный способ сделать это.

>>> App\User::find(1)->roles->where('role_id', '<', 1)
=> Illuminate\Database\Eloquent\Collection {#3185
     all: [
       App\models\Role {#3176
         id: 1,
         name: "super-admin",
         display_name: "Super Admin",
         description: "This will be one permission, that can not be assigned or
modified.",
         created_at: "2018-12-13 12:09:07",
         updated_at: "2018-12-13 12:09:07",
         pivot: Illuminate\Database\Eloquent\Relations\Pivot {#3177
           user_id: 1,
           role_id: 1,
         },
       },
     ],
   }
>>>
Dell@DESKTOP-KU6707L MINGW64 /d/work/www/charmboard (master)
$ php artisan tinker
Psy Shell v0.9.9 (PHP 7.2.10 — cli) by Justin Hileman
>>> App\User::find(1)->roles->where('role_id', 1)
=> Illuminate\Database\Eloquent\Collection {#3129
     all: [],
   }
>>> App\User::find(1)->roles->where('role_id', 1)->count()
=> 0
>>>

и работает на

>>> App\models\Role::where('id', 1)->count()
=> 1

и ваш случай первый 1, я думаю, вы можете загружать и использовать где, как

>>> App\User::find(1)->roles()->where('role_id', 1)->get()
=> Illuminate\Database\Eloquent\Collection {#3138
     all: [
       App\models\Role {#3129
         id: 1,
         name: "super-admin",
         display_name: "Super Admin",
         description: "This will be one permission, that can not be assigned or
modified.",
         created_at: "2018-12-13 12:09:07",
         updated_at: "2018-12-13 12:09:07",
         pivot: Illuminate\Database\Eloquent\Relations\Pivot {#3128
           user_id: 1,
           role_id: 1,
         },
       },
     ],
   }
>>>

За несколько дней, здесь , я усвоил этот урок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...