Какую версию 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):
- Объект
- Ключ объекта в коллекции
В вашем случае вы можете пропустить второй параметр.
Например:
$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
});