С функцией, не работающей, чтобы загрузить, имеет много данных отношения laravel Model Eloquent - PullRequest
0 голосов
/ 15 мая 2018

У меня есть эти две модели.Эта модель телефона является распространенной моделью, которую можно использовать для сохранения и получения значения телефона для пользователя, клиента, сотрудника и т. Д.Таким образом, meta_value используется для сохранения идентификатора связанной модели, а meta_key используется для определения отношения имени модели.

/* Customer Model*/
namespace App;    
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Customer extends Model {
    /**
     * Get the Phone List.
     */
    public function phones(){
        return $this->hasMany('App\Phone','meta_value', 'id')
                    ->select('id as phone_id','contact_number as phone','contact_number','country_code','type','dial_code')
                    ->where('meta_key','customer');
    }
}
/* Phone Model*/
namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;


class Phone extends Model {
    /**
     * Get the customer that owns the phone.
     */
    public function customer(){
        return $this->belongsTo('App\Customer', 'meta_value');
    }
}

Я не могу получить данные телефонов с данными клиентов.Всегда возвращается

[relations:protected] => Array
    (
        [phones] => Illuminate\Database\Eloquent\Collection Object
            (
                [items:protected] => Array
                    (
                    )

            )

    )

В моем контроллере я делаю следующий код.

/*This is the case when I want to get the data for a single customer.*/
        $customer = Customer::find('448')->with('phones')->get();
        print_r($customer); // It will return all customers with no phones value.

        $customer = Customer::find('448');
        print_r($customer);die; // It will return a single customer whose id is 448 with no phones value.

        print_r($customer->phones);die; // I can get the values of phones by this

        $customer = Customer::find('448')->with('phones');
        print_r($customer);die; // It will crash my postman when i hit this.

        /*This is the case when I want to get the data for multiple customers.*/
        $customers = Customer::where('id', '>', '447')->with('phones')->get();
        print_r($customers);die; // It will return multiple customer with empty phones value.

        // However when I iterate through the loop and get phones then I can get the phone value. 
        $customers = Customer::where('id', '>', '447')->get();
        foreach ($customers as $customer) {
            $customer->phones = $customer->phones;
        }
        print_r($customers);die;

Работает только итерация, но я думаю, что это не очень хорошее решение.Даже я пытаюсь загрузить функцию, но не работает.

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Вы должны выбрать необходимый столбец внешнего ключа meta_value:

->select('id as phone_id','contact_number as phone','contact_number','country_code',
    'type','dial_code','meta_value')

Для одного клиента вам не нужна энергичная загрузка:

$customer = Customer::find(448);
$phones = $customer->phones;

Похоже, вы должны использовать полиморфные отношения .

0 голосов
/ 15 мая 2018

Хотя я подозреваю, что выбор phone_id в качестве id мог повлиять на запрос при проверке взаимосвязи, но быстрая отладка могла бы удалить его из связанной функции:

->select('id as phone_id','contact_number as phone','contact_number','country_code','type','dial_code')
                ->where('meta_key','customer');

И позволитьфункция phones быть просто,

public function phones(){
    return $this->hasMany('App\Phone','meta_value', 'id');
}

~ ОБНОВЛЕНО ~

Затем вам нужно , чтобы использовать load вместо.

Если вам необходимо выполнить дополнительную проверку позже для отношения, затем передайте обратный вызов для его фильтрации:

$customer = Customer::find('448')->load(['phones' => function($query) {
    $query->where('meta_key','customer');
}]);

Или:

$customer = Customer::with(['phones' => function($query) {
    $query->where('meta_key','customer');
}])->find('448');

Исходная проблема:

Использование with и get в результате find создает еще один экземпляр модели для нового запроса, следовательно, вы получите только все записи о клиентах.Вы можете использовать метод load, или если вы будете использовать with, тогда вам придется установить фильтр в конце функций запроса.

Для лучшего понимания, пожалуйста, отметьте Laravelдокументация по быстрой загрузке

...